Mysql查询天数的日期差异

Posted

技术标签:

【中文标题】Mysql查询天数的日期差异【英文标题】:Mysql queries for date difference in days 【发布时间】:2015-09-11 10:48:44 【问题描述】:

这里需要帮助,有一个名为 APPROVALmysql 表,那里有一个 id,dateandtimelevel, i 需要一个查询来单独选择 id 并满足以下条件。

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

如何为此编写查询。

提前致谢。

【问题讨论】:

对不起,先生,我不知道如何编写这个查询,我在这里有点新手。 我不会对你投反对票,但我建议你编辑你的问题,因为它很难说清楚..(通常人们在需要时会打招呼和感谢) 所以(因为它仍然不是很清楚......)你想检索匹配级别 = 5 的记录的 id,如果日期差在 30 和 60 之间,你不? 是的,先生,你是对的 :) 在查询下方确定,在您的脚本上对其进行测试并还原;)祝您有美好的一天! 【参考方案1】:

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

会产生你想要的。注意&gt;= 用于日期范围的开始,&lt; 和额外的一天用于范围的结束。我们这样做是因为我们想要从第 60 天开始的所有项目,而不是从第 61 天开始的所有项目。

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

注意像这样的表达式

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

也会产生正确的结果,但是在要搜索的列上调用DATE() 会使其unsargeable。也就是说,它使 MySQL 无法使用索引来满足搜索。

【讨论】:

感谢您的快速响应,我该如何以php代码点火器框架的形式编写此查询。 @Crysis 如何将其放入 codeigniter 是一个不同的问题。您可能应该做一些研究,如果您无法弄清楚,请单独提出该问题。无论如何,我不是 codeIgniter 用户,所以我不知道。【参考方案2】:

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

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

我建议你也订购它们 dy date DESC。

希望有帮助

【讨论】:

您建议的对 DateTime 的搜索无法利用索引。【参考方案3】:

希望,我正确理解了您的问题。

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,您可以操作日期表达式而不必担心它的限制。

【讨论】:

您建议的对 DateTime 的搜索无法利用索引。 @OllieJones 感谢您的意见。看到你的回答很有道理。 :)

以上是关于Mysql查询天数的日期差异的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个同时适用于 HSQLDB 和 MySQL 的查询以在 WHERE 子句中为日期添加天数?

如何将日期字符串转换为 mysql 日期格式以使用 mysql 查询计算日期差异

MySQL - 获取两个日期之间的年龄和天数

在mysql查询中使用php time()函数计算两个日期之间的差异

获取MySQL中两个日期相差的天数

Javascript和datediff mysql中日期之间的日期差异不相等