这些查询 MySQL 日期范围之间有啥区别

Posted

技术标签:

【中文标题】这些查询 MySQL 日期范围之间有啥区别【英文标题】:What's the difference between these queries MySQL date range这些查询 MySQL 日期范围之间有什么区别 【发布时间】:2020-12-11 08:14:38 【问题描述】:

我有一个名为 order_match 的表与此列

+----+-----------+
| id | createdAt |
+----+-----------+

所以我想进行查询以找出出现在 7 天后的范围内的 ID

我有 2 个查询,idk 哪个是真的,为什么它会变成真的

查询 1

SELECT om.id
    FROM order_match om
    WHERE om.createdAt >= 
    DATE_SUB(curdate(), INTERVAL 1 WEEK)  AND
    om.createdAt <
    ADDDATE(DATE_SUB(curdate(), INTERVAL 1 WEEK), INTERVAL 9 DAY)
    GROUP BY om.id;

它返回 57 id

查询 2

SELECT om.id
    FROM order_match om
    WHERE om.createdAt >= 
    now() - INTERVAL 7 DAY  AND
    om.createdAt <
    now() + INTERVAL 1 DAY
    GROUP BY om.id;

它返回 2 个 id

请问哪一个是真的?还是这两个查询都是错误的?

EXPECTED RESULTS

assume curdate = '2020-02-05'

THEN IF the table was become like this

+----+------------+
| id | createdAt  |
+----+------------+
|  1 | 2020-02-02 |
|  2 | 2020-02-03 |
|  3 | 2020-02-04 |
+----+------------+

THEN all of the ID are included because the ids was on the range between 2020-02-05  and 7 days behind (2020-01-30 00:00:00)

【问题讨论】:

出现在 7 天后的范围内的 ID - 您需要比这更具体。 好的,让我编辑一下 您能否分享示例数据,以便其他人可以重现该问题? 完成先生,我已经输入了预期的结果 两者都不是。在没有任何聚合函数的情况下,GROUP BY 子句永远不合适 【参考方案1】:

您的第一个查询发现从 7 天前的午夜开始的 9 天范围;您的第二个查询仅找到从 当前时间 7 天前开始的 8 天范围。由于范围不同,结果不同也就不足为奇了。

【讨论】:

那么根据我的预期结果,那哪个是真的? 我不知道你所说的“真实”是什么意思。任何一个都应该返回样本数据的所有三个记录。 是的,但根据我的真实数据,用户数量存在显着差异。 是的,因为他们两个从不同的最早点开始选择不同长度的范围。我试图解释这两个查询的作用;只有你可以决定你的意思是什么,如果要么

以上是关于这些查询 MySQL 日期范围之间有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

3个日期范围之间的Mysql查询

PHP/MySQL:对数据库中的重复事件进行建模,但查询日期范围

MySQL 用 BETWEEN AND 日期查询包含范围边界

MySQL 用 BETWEEN AND 日期查询包含范围边界

MySQL:查找日期范围之间的缺失日期

mysql日期范围查找(两个日期之间的记录)