查询以选择在特定时间段内具有日期的行

时间:2019-01-23 11:09:38

标签: mysql

我正在尝试运行一个查询,该查询将选择due列中带有日期的所有行,其中的日期分别为due的时间戳15分钟,10分钟和5分钟,如果还有,从last_reminder列中的时间戳记起15分钟

SELECT a.* FROM tasks a WHERE 
    a.due <> '0000-00-00 00:00:00' AND a.status = '' AND 
    (
        due > NOW() - INTERVAL 15 MINUTE OR 
        due > NOW() - INTERVAL 10 MINUTE OR 
        due > NOW() - INTERVAL 5 MINUTE OR 
        last_reminder <= '".date('Y-m-d H:i:s', strtotime(date("Y-m-d H:i:s"). ' - 15 minutes'))."'
    ) 

此查询返回所有行,无论时间是否在5分钟,10分钟或15分钟之内

1 个答案:

答案 0 :(得分:0)

您的要求不太清楚。

但这很明显。该过滤器子句

    due > NOW() - INTERVAL 15 MINUTE OR 
    due > NOW() - INTERVAL 10 MINUTE OR 
    due > NOW() - INTERVAL 5 MINUTE

在逻辑上等效于此。

    due > NOW() - INTERVAL 15 MINUTE

另外,我想你想要这个

last_reminder <= '".date('Y-m-d H:i:s', strtotime(date("Y-m-d H:i:s"). ' - 15 minutes'))."

变成这个SQL

last_reminder <= '2019-01-23-06:45' - INTERVAL 15 minutes

认为,您忘记了“间隔”。

此外,您可能需要php表达式date('Y-m-d H:i:s')。这样可以像检索到的一样有效地检索当前的日期戳。或者,您可以只使用SQL的NOW()并获得更简单的查询。

last_reminder <= NOW() - INTERVAL 15 minutes

要满足15/10/5的要求,也许您需要这样的东西:

SELECT IF(due>NOW()-INTERVAL 15 MINUTE AND due<=NOW()-INTERVAL 10 MINUTE, 'yes', 'no') ago15,
       IF(due>NOW()-INTERVAL 10 MINUTE AND due<=NOW()-INTERVAL 5 MINUTE, 'yes', 'no') ago10,
       IF(due>NOW()-INTERVAL 5 MINUTE, 'yes', 'no') ago5,
       a.*
  FROM ...

这将为您提供三列,显示您的行处于15分钟,10分钟还是5分钟类别。

要对计时问题进行故障排除,可以将其添加到SELECT子句中:

 TIMEDIFF(NOW(), due) AS how_long_until_due,

它将针对每一行显示直到到期每个项目为止的时间。