0

我正在开发一个汽车列表网站,我被困在如何正确设置日期背后的一些逻辑上。

我为数据库 http://www.sqlfiddle.com/#!2/e111e/3创建了一个 sql fiddle

我想每天上午 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`

WHERE DATEDIFF(expiry_date, NOW()) = 1 AND HOUR(TIMEDIFF(expiry_date, NOW())) > 24

4

2 回答 2

2

MySQLdatediff只考虑实际天数,而不是小时数。尝试使用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)
于 2013-02-05T10:05:29.627 回答
0

建议您创建一个事件调度程序

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
;
于 2013-02-05T10:10:53.643 回答