Mysql查询天数的日期差异
Posted
技术标签:
【中文标题】Mysql查询天数的日期差异【英文标题】:Mysql queries for date difference in days 【发布时间】:2015-09-11 10:48:44 【问题描述】:这里需要帮助,有一个名为 APPROVAL 的 mysql 表,那里有一个 id,dateandtime
和 level, i
需要一个查询来单独选择 id
并满足以下条件。
从数据库中单独获取日期并将其与当前系统日期进行比较,如果天数超过 30 和 60 以及 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
会产生你想要的。注意>=
用于日期范围的开始,<
和额外的一天用于范围的结束。我们这样做是因为我们想要从第 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 查询计算日期差异