PHP从MySQL中选择日期字段为将来7天

时间:2013-06-28 14:20:38

标签: mysql

我有一个自动检查程序,用于检查将在未来7天内过期的域名,然后发送并通过电子邮件发送给客户。

我正在使用此SQL查询:

SELECT * from domain_names where status = '' or status = 'valid' and expiry_date = DATE(NOW() + INTERVAL 7 DAY)

但它无法正常工作。我需要它来检查具有expiry_date的行,确切地说是未来7天。此外,如果检查器停止运行并且它在未运行的时间内错过了某些行,那么它也需要执行这些行

6 个答案:

答案 0 :(得分:2)

您可能已将expiry_date定义为日期时间值,这意味着您的比较不正确。例如你需要使用

SELECT ... WHERE date(expiry_date) = date(now() + interval 7 day)

(注意在date()操作中包装+7天。

e.g。

给定一个包含日期和日期时间字段的表:

+------------+---------------------+
| d          | dt                  |
+------------+---------------------+
| 2013-06-28 | 2013-06-28 08:23:03 |
+------------+---------------------+

注意比较结果如何:

mysql> select d=now(), d=date(now()), dt=now(), dt=date(now()), now() from x;
+---------+---------------+----------+----------------+---------------------+
| d=now() | d=date(now()) | dt=now() | dt=date(now()) | now()               |
+---------+---------------+----------+----------------+---------------------+
|       0 |             1 |        0 |              0 | 2013-06-28 08:26:20 |
+---------+---------------+----------+----------------+---------------------+
1 row in set (0.00 sec)

日期v.s. datetime = false
date v.s date = true
datetime v.s. datetime = false(hh:mm:ss不匹配,所以不相等)
datetime v.s. date = false(日期扩展到yyyy-mm-hh 00:00:00,而hh:mm:ss不匹配

答案 1 :(得分:0)

您必须在and / or条件

中使用括号
SELECT * from domain_names 
where (status = '' or status = 'valid')
and expiry_date = curdate() + INTERVAL 7 DAY

或在您的案例中使用in

SELECT * from domain_names 
where status in ('', 'valid')
and expiry_date = curdate() + INTERVAL 7 DAY

答案 2 :(得分:0)

假设您的失效日期是正确的日期时间字段

expiry_date=DATE_ADD(NOW(), INTERVAL 7 DAY)

更可靠
expiry_date=DATE(NOW() + INTERVAL 7 DAY)

如果你想要在未来7天内实际考虑它,你也必须使用一个日期

这样的事情只能返回有效期至今为止7天的请求。

DATEDIFF(expiry_date,DATE(NOW() + INTERVAL 7 DAY))=7

虽然这不是万无一失的,但最好让它检查从现在到未来7​​天的所有日子,然后如果它在您的数据库中设置“发送电子邮件”标志,那么您可以确认电子邮件实际上是发送而不是盲目地信任脚本有效。

答案 3 :(得分:0)

这应该根据需要提供结果:

DATE_SUB(CURDATE(),INTERVAL 7 DAY) = expiry_date;

您可以参考以下链接了解更多详情:

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

答案 4 :(得分:0)

如果您需要建议在检查程序停止运行期间遗漏的行,那么您应该使用额外的标记来指示域是否已经建议。 之后,您必须选择日期低于现在+ 7天的所有行,并标记为“不建议”。 发送电子邮件标签后,将其作为“建议”。当他们重新将域名标签重新修改为“不建议”时。

答案 5 :(得分:-4)

$date=date('Y-m-d');
$date=date('Y-m-d', strtotime($date . ' + 7 day'));


//Now, use this query.

SELECT * from domain_names where status = '' or status = 'valid' and expiry_date = '{$date}';