所以这里是情况。在我的数据库表中,我有一个名为expire_date的列,我为每行放置了一个确定的日期。 因此,例如截止日期是2012年4月28日php取得日期-1月
我需要一个PHP代码,将通过电子邮件发送某个用户的通知,该日期到期的某些事情是从过期1个月。所以如果今天是28-03-2012,那就意味着在该事情到期之前只有1个月。 我没有为此做任何代码,因为我不知道如何解决-1个月。
所以这里是情况。在我的数据库表中,我有一个名为expire_date的列,我为每行放置了一个确定的日期。 因此,例如截止日期是2012年4月28日php取得日期-1月
我需要一个PHP代码,将通过电子邮件发送某个用户的通知,该日期到期的某些事情是从过期1个月。所以如果今天是28-03-2012,那就意味着在该事情到期之前只有1个月。 我没有为此做任何代码,因为我不知道如何解决-1个月。
首先获得SQL的日期在一个月内使用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 . '"');
我希望这有助于
echo strtotime("-1 day"); //1332864156
echo date("y-m-d",strtotime("-1 day")); // 12-03-27
SELECT user, email FROM tbl WHERE expire_date = CURRENT_TIMESTAMP - INTERVAL 1 MONTH
请注意,我用=
和不小于,因为如果你只是比较,它的不到一个月的时间,那么你将每天的最后一个月内发送电子邮件的用户。
这选择一个月前过期的记录。 – 2012-03-28 16:05:24
你可能需要把你的日期字符串变成unix时间,然后做一个选择日期。 (我假设你使用sql)。
SELECT * FROM table WHERE (SELECT datediff(now(),your-date-in-unixtime) > 30)
您应该避免在您尝试过滤的字段上使用函数,因为它会使索引不可用。 – nnichols 2012-03-28 16:25:03
你可以在你的MySQL Query中使用ADDDATE()
函数。
> SELECT ADDDATE( '28-03-2012', INTERVAL 1 MONTH)
28-04-2012
更多关于它here。
WHERE expire_date = ADDDATE(CURDATE(), INTERVAL 1 MONTH)
(更多关于CURDATE()
右here)
如果:
如果您对您的expire_date
列的索引,这可能是非常快,如果你查询的条目有WHERE
声明像做你每天只需要一次它只会选择所有人最多一次,并且不会向他们发送两次电子邮件,因为它只会选择那些距离其过期日正好一个月的邮件。
当然,如果您在MySQL表中使用DATE字段类型,则无需额外关心日期的具体表示。
也许你应该在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');
对于您可以使用下面的查询
SELECT *
FROM tablename
WHERE DATE_FORMAT(created_at, '%Y/%m/%d') = (CURDATE() + INTERVAL 1 MONTH)
你应该总是避免这样做。使用DATE/DATETIME字段中的'DATE_FORMAT()'要过滤将会导致任何索引无用。 – nnichols 2012-03-28 16:22:29
正如指出的@Mikhail你应该使用=
,所以你只检索记录一次。你不想成为日常生活垃圾邮件用户整个月的运行到EXPIRE_DATE -
SELECT *
FROM tbl
WHERE expire_date = CURRENT_DATE + INTERVAL 1 MONTH
如果EXPIRE_DATE包含,而不是你应该使用类似一个Date值DATETIME -
SELECT *
FROM tbl
WHERE expire_date BETWEEN (CURRENT_DATE + INTERVAL 1 MONTH) AND (CURRENT_DATE + INTERVAL 1 MONTH + INTERVAL 1 DAY - INTERVAL 1 SECOND)
简单地;
$WeekAgo = strtotime("-1 week"); //A week before today
$MonthAgo = strtotime("-1 month"); //A month before today
谢谢。得到它的工作! – gogu 2012-03-28 16:18:55
@Tales你实际上应该能够使用1 less date()函数获得相同的日期,如:date('Ym-d',strtotime(date('Ym-d')。'+1 month')) ;' – OnethingSimple 2015-07-15 14:59:40
@Tales实际上,我猜只是'echo date('Ym-d',strtotime('+ 1 month'));'对吗? – OnethingSimple 2015-07-15 15:15:43