2012-03-28 4 views
8

Итак, вот что такое. В моей таблице db у меня есть столбец с именем expire_date, где я помещаю определенную дату для каждой строки. Так, например, срок действия 28-04-2012php дата получения -1 месяц

Мне нужен код php, который отправит определенному пользователю уведомление по электронной почте, что определенная вещь, которая истекает в эту дату, составляет 1 месяц с момента истечения срока действия. Так что если сегодня 28-03-2012, это означает, что до того, как эта вещь истечет, есть только 1 луна. Я не делал никакого кода для этого, потому что я не знаю, как решить -1 месяц.

ответ

13

сначала получить дата в течение одного месяца с PHP:

$myDate = date("Y-m-d", strtotime(date("Y-m-d", strtotime(date("Y-m-d"))) . "+1 month")); 

Затем вы можете сделать выбор:

$result = mysql_query('SELECT * FROM myTable WHERE expire_date BETWEEN NOW AND "' . $myDate . '"'); 

И у вас есть массив со всеми предметами, срок действия которых истекает менее чем за один месяц. Если вы хотите точно те, которые истекают в течение 1 месяца:

$result = mysql_query('SELECT * FROM myTable WHERE expire_date = "' . $myDate . '"'); 

Я надеюсь, что это помогает

+0

спасибо. Сработало! – gogu

+1

@Таблицы, на самом деле вы должны иметь возможность получить одну и ту же дату, используя 1 функцию date(), такую ​​как: 'date ('Ym-d', strtotime (date ('Ym-d'). '+1 месяц')) ; ' – OnethingSimple

+1

@Tales На самом деле, я думаю, просто' echo date ('Ym-d', strtotime ('+ 1 month')); 'right? – OnethingSimple

1
SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH 

Обратите внимание, что я использую = и не менее, потому что если вы просто сравните, что это меньше, чем один месяц, то вы будете по электронной почте пользователей каждый день в течение последнего месяца ,

+0

Отбирает записи, срок действия которых истек месяц назад. –

0

Возможно, вам понадобится включить строку даты в unix-время, а затем сделать выбранный файл. (Я предполагаю, что вы используете sql).

SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30) 
+0

Вам следует избегать использования функций в полях, которые вы пытаетесь фильтровать, поскольку это делает непригодные индексы. – nnichols

1

Вы можете использовать ADDDATE() функции в вашем MySQL Query.

> SELECT ADDDATE( '28-03-2012', INTERVAL 1 MONTH) 
28-04-2012 

Подробнее об этом here.

Если у вас есть индекс на вашей expire_date колонки, это можно сделать довольно быстро, если вы запрашиваете для записей с WHERE заявления как:

WHERE expire_date = ADDDATE(CURDATE(), INTERVAL 1 MONTH) 

(Подробнее о CURDATE() правой here)

If вы делаете это каждый день ровно один раз он будет выбирать только всех людей в макс один раз и не отправлять им письмо дважды, так как он выбирает только те, которые находятся на расстоянии 1 месяца от даты истечения срока действия.

Конечно, это работает без дополнительной заботы о конкретном представлении дат, если вы используете 0тысль DATE fieldtype в вашей таблице MySQL.

3

Возможно, вы должны сделать это в SQL, а не в PHP нет?

Если вы хотите сделать в в PHP, здесь является экологически чистым способом, чем @Expert хотят быть

$date = new DateTime();//now 
$interval = new DateInterval('P1M');// P[eriod] 1 M[onth] 
$date->sub($interval); 
echo $date->format('Y-m-d');  
-1

Для SQL можно использовать следующий запрос

SELECT * 
FROM tablename 
WHERE DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH) 
+0

Вы всегда должны избегать этого. Используя 'DATE_FORMAT()' в поле DATE/DATETIME, которое вы хотите отфильтровать, сделает любой индекс бесполезным. – nnichols

2

Как отметил @Mikhail вы должны использовать =, так что вы только получить записи один раз. Вы не хотите быть спамить пользователей каждый день в течение всего месяца, подбежав к expire_date -

SELECT * 
FROM tbl 
WHERE expire_date = CURRENT_DATE + INTERVAL 1 MONTH 

Если expire_date содержит DATETIME, в отличие от значения DATE вы должны использовать что-то вроде -

SELECT * 
FROM tbl 
WHERE expire_date BETWEEN (CURRENT_DATE + INTERVAL 1 MONTH) AND (CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY - INTERVAL 1 SECOND) 
5

Просто;

$WeekAgo = strtotime("-1 week"); //A week before today 
    $MonthAgo = strtotime("-1 month"); //A month before today 
Смежные вопросы