Mysql查询日期差异的天数

时间:2015-09-11 10:48:45

标签: php mysql datetime query-optimization

在这里需要帮助,有一个名为 APPROVAL 的mysql表,有一个id,dateandtimelevel, i需要一个查询,单独选择id以下条件。

仅从数据库中获取日期并将其与当前系统日期进行比较,如果天数超过 30 60 以及level = 5以上。

如何为此编写查询。

提前致谢。

3 个答案:

答案 0 :(得分:2)

MySQL有很好的日期算术。例如,表达式

 CURDATE() + INTERVAL 30 DAY

给出一个日期时间值,表示午夜30天。同样

CURDATE()  + INTERVAL 61 DAY 

在第61天产生午夜。

所以查询表格

   SELECT ID
     FROM APPROVAL
    WHERE Level = 5
      AND `DateTime` >=  CURDATE() + INTERVAL 30 DAY
      AND `DateTime` <   CURDATE() + INTERVAL 61 DAY

会产生你想要的东西。请注意>=用于天数范围的开始,使用<和额外的一天用于范围的结束。我们这样做是因为我们想要第60天的所有项目,而不是第61天的所有项目。

(Level, DateTime)上的复合索引将使此查询非常有效地满足。

请注意表达式

    DATE(`DateTime`) <=   CURDATE() + INTERVAL 60 DAY  /* slow! */

也会产生正确的结果,但是要对要搜索的列进行DATE()函数调用会使其成为 unsargeable 。也就是说,它使MySQL无法使用索引来满足搜索。

答案 1 :(得分:1)

好的,请使用此查询检索与当前日期相比,匹配级别5和30到60之间的日期差异的所有ID。

SELECT id
FROM APPROVAL
WHERE level = 5 && DATEDIFF(NOW(), dateandtime) BETWEEN 30 AND 60

我建议你订购他们和DESC约会。

希望有所帮助

答案 2 :(得分:0)

我希望,我能正确理解你的问题。

select `ID`
from APPROVAL
where `Level` = 5
    and ( DATE(`DateTime`) > curdate() + interval 30 day 
        and DATE(`DateTime`) < curdate() + interval 60 day )
order by `ID` asc;

DATE()从日期时间获取日期,CURDATE()是当前系统日期。使用interval,您可以操纵日期表达式whitout,而不必担心其限制。