我有一个自动检查程序,用于检查将在未来7天内过期的域名,然后发送并通过电子邮件发送给客户。
我正在使用此SQL查询:
SELECT * from domain_names where status = '' or status = 'valid' and expiry_date = DATE(NOW() + INTERVAL 7 DAY)
但它无法正常工作。我需要它来检查具有expiry_date的行,确切地说是未来7天。此外,如果检查器停止运行并且它在未运行的时间内错过了某些行,那么它也需要执行这些行
答案 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}';