我正在一个自动登录网站上工作,我被如何正确确定日期的逻辑所困扰。
我为数据库创建了一个sql fiddlehttp://www.sqlfiddle.com/#!2/e111e/3
我想每天上午12点运行一个cron,我想给一天内将要过期的内容(忽略已经过期的内容)的用户发电子邮件,但他们之间必须有24小时的时间差,因为我想至少提前24小时告诉他们列表将要过期。此外,它应该只选择那些将在一天后到期且不超过1天的房源。
以下是我迄今为止尝试的
SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date, DATEDIFF(expiry_date, NOW()) AS days_left FROM `test` WHERE DATEDIFF(expiry_date, NOW()) = 1
但它也在选择哪些将在24小时内到期。
请帮我。
编辑///////////////////////////////////////////////////////////////
我已经想通了。伙计们,告诉我它是否正确。
SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date, DATEDIFF(expiry_date, NOW()) AS days_left, HOUR(TIMEDIFF(expiry_date, NOW())) as hours FROM `test`
其中DATEDIFF(expiry_date,NOW())=1 AND HOUR(TIMEDIFF(expry_date,NO()))>24
MySQL的datediff
只考虑实际天数,而不考虑小时。尝试使用TO_SECONDS
,并以秒为单位计算差值。
更新:这是与小提琴一起工作的代码:
SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expDate,
to_seconds(expiry_date) - to_seconds(NOW()) AS seconds_left
FROM `test`
WHERE
to_seconds(expiry_date)- to_seconds(now()) <= 86400
-- AND ... (only include non-expired entries)
建议您创建一个事件调度程序:
CREATE EVENT EXIPRIYALERT
ON SCHEDULE EVERY DAY AT '00:00:00' STARTING FROM '2013-02-04'
DO
---
对于您的查询,请尝试以下操作:TIMESTAMPDIFF:
TIMESTAMPDIFF(second,Now(),expiry_date)
SELECT DATE_FORMAT(expiry_date, '%b %d %Y %T') AS expiry_date,
DATEDIFF(expiry_date, NOW()) AS days_left
FROM `test`
WHERE TIMESTAMPDIFF(second,Now(),expiry_date) = 86400
;