含WHERE/AND/OR的SQL SELECT语句逻辑异常排查求助
问题排查与修复方案
嘿,我一眼就瞅出问题所在了——这是SQL里经典的逻辑运算符优先级陷阱!
问题根源
在SQL的运算规则里,AND的优先级要比OR高得多。你写的原语句:
select * from usr_booking where shop_id='21' and start_time between '10:10:00' and '11:01:00' or end_time between '10:10:00' and '11:01:00'
实际会被数据库解析成:
(shop_id='21' 且 start_time 在目标区间内) 或者 (end_time 在目标区间内)
这就意味着,哪怕某条记录的shop_id不是21,只要它的end_time落在区间里,也会被查出来——完全违背了你“只查shop_id=21的记录”的初衷。
修正后的SQL
解决方法很简单:把start_time和end_time的判断条件用括号包裹起来,强制让OR逻辑先执行,再和shop_id的条件做AND运算:
select * from usr_booking where shop_id='21' and (start_time between '10:10:00' and '11:01:00' or end_time between '10:10:00' and '11:01:00');
验证你的样本数据
你的样本记录:
| id | shop_id | start_time | end_time |
|---|---|---|---|
| 1 | 21 | 10:00 | 11:00 |
修正后的语句会成功命中这条记录:因为end_time='11:00'正好处于'10:10:00'到'11:01:00'的区间内,同时shop_id=21的条件也满足。
小提醒:如果你的start_time和end_time字段是TIME或DATETIME类型,尽量使用对应类型的字面量(比如不用字符串,直接写时间值),避免潜在的类型转换问题,但当前场景下字符串格式匹配的话也能正常工作。
内容的提问来源于stack exchange,提问作者Priya Jaiswal
相关产品推荐
相关产品推荐

