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
相关产品推荐
相关产品推荐

