Php get date -1 месяц

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

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

Ответ 1

Сначала введите дату в месяц с помощью 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 . '"' );

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

Ответ 3

Просто

    $WeekAgo = strtotime("-1 week"); //A week before today
    $MonthAgo = strtotime("-1 month"); //A month before today

Ответ 4

Может быть, вы должны сделать это в 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');     

Ответ 5

Как указано @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)

Ответ 6

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

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

Ответ 7

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

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

Подробнее об этом здесь.

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

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

(Подробнее о CURDATE() right здесь)

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

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

Ответ 8

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

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

Ответ 9

Как получить месяц назад в php

<?php
  $d = strtotime("-1 Months");
  echo date("Y-m-d h:i:sa", $d);
?>

Ответ 11

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

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