You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL使用BETWEEN查询日期区间出现异常的原因解析

MySQL BETWEEN 查询异常的原因解析

兄弟,你这问题其实是踩了MySQL里BETWEEN运算符的一个基础坑——BETWEEN 左值 AND 右值本质上等价于字段 >= 左值 AND 字段 <= 右值,而且必须保证左值 ≤ 右值,否则查询条件会变成逻辑矛盾,自然返回空结果。

我们逐个拆解你的四个查询,结合@TimBiegeleisen的例子(假设当前NOW()是2018-05-30)来分析:

1. 有效:查询未来24小时记录

你的SQL:

select * from table where date between NOW() and NOW() + 1 interval day;

等价于逻辑判断:

select * from table where date >= '2018-05-30' AND date <= '2018-05-31';

这个区间是合理的,只要表中有未来24小时内的记录,就能正常返回结果。

2. 无记录:错误的过去24小时查询

你的SQL:

select * from table where date between NOW() and NOW() - 1 interval day;

等价于逻辑判断:

select * from table where date >= '2018-05-30' AND date <= '2018-05-29';

一个日期不可能同时大于等于30号又小于等于29号,逻辑完全矛盾,所以自然查不到任何记录。

3. 无记录:反转参数的未来区间查询

你的SQL:

select * from table where date between NOW() + 1 interval day AND NOW();

等价于逻辑判断:

select * from table where date >= '2018-05-31' AND date <= '2018-05-30';

同样是逻辑矛盾,没有任何日期能满足这个条件,所以返回空结果。

4. 有效:正确的过去24小时查询

你的SQL:

select * from table where date between NOW() - 1 interval day AND NOW();

等价于逻辑判断:

select * from table where date >= '2018-05-29' AND date <= '2018-05-30';

这个区间覆盖了过去24小时的范围,只要表中有符合条件的记录,就能正常返回。

总结

使用BETWEEN时,一定要牢记左参数必须是范围的下限,右参数必须是范围的上限,否则就会出现逻辑矛盾导致查询无结果。如果怕搞混参数顺序,也可以直接用明确的>=和<=来写条件,比如查询过去24小时的记录可以写成:

select * from table where date >= NOW() - 1 interval day AND date <= NOW();

这样就完全不会有参数顺序的问题啦~

内容的提问来源于stack exchange,提问作者rolinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:06:51