0

我有一个自动检查器,用于检查将在接下来的 7 天内到期的域,并将其发送并通过电子邮件发送给客户。

我使用这个 SQL 查询:

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

但它不能正常工作。我需要它来检查 expiry_date 是 7 天之后的行。此外,如果检查器停止运行并且它在未运行的时间内错过了一些行,它也需要执行这些行

4

6 回答 6

2

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

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

取而代之的是(注意 +7 天在date()操作中的包装。

例如

给定一个带有日期和日期时间字段的表:

+------------+---------------------+
| 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)

date vs datetime = false
date vs date = true
datetime vs datetime = false (hh:mm:ss 不匹配,所以不相等)
datetime vs date = false (日期扩展为 yyyy-mm-hh 00:00: 00 和 hh:mm:ss 不匹配

于 2013-06-28T14:28:13.147 回答
0

如果您需要在检查器停止运行期间通知丢失的行,您应该使用额外的标签来指示域是否已被通知。之后,您必须选择日期低于现在 + 7 天的所有行并标记为“不建议”。发送电子邮件标签后,将其标记为“建议”。当他们将域标签重新更新为“不建议”时。

于 2013-06-28T14:38:33.147 回答
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
于 2013-06-28T14:23:43.120 回答
0

这应该会根据您的需要给出结果:

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

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

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

于 2013-06-28T14:29:35.260 回答
0

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

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

比更可靠

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

实际上,如果您想在未来 7 天准确地考虑它,您也必须使用 datediff

像这样的东西只返回到期日期正好是从今天起 7 天的请求。

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

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

于 2013-06-28T14:26:24.160 回答
-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}';
于 2013-06-28T14:23:14.187 回答