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

MySQL中商家时段重叠校验查询的AND/OR运算符组合逻辑错误排查

问题分析与解决方案

嘿,这个问题我太熟悉了——核心是MySQL的运算符优先级规则在悄悄搞鬼!

你的查询逻辑为什么跑偏了?

MySQL里AND的优先级比OR高,这意味着你的原语句:

SELECT * FROM merchant_slots WHERE merchantId='14955' AND day='2' AND merchant_slots.start_time BETWEEN '10:00' AND '14:00' OR merchant_slots.end_time BETWEEN '10:00' AND '14:00'

会被MySQL自动解析成这个样子:

SELECT * FROM merchant_slots 
WHERE (merchantId='14955' AND day='2' AND merchant_slots.start_time BETWEEN '10:00' AND '14:00') 
OR (merchant_slots.end_time BETWEEN '10:00' AND '14:00')

看到没?OR后面的条件完全脱离了day='2'的约束!你表中id=2的记录end_time是11:00,刚好落在10:00-14:00区间里,所以哪怕day='2'没有数据,这条记录也会被查出来,这就是你看到的错误结果。

修正后的正确语句

要让OR的两个条件都服从merchantId='14955' AND day='2'的约束,你需要给OR的两个条件加上括号,明确逻辑分组:

SELECT * FROM merchant_slots 
WHERE merchantId='14955' 
AND day='2' 
AND (merchant_slots.start_time BETWEEN '10:00' AND '14:00' OR merchant_slots.end_time BETWEEN '10:00' AND '14:00')

额外优化:更全面的时段重叠判断

另外,如果你是要校验同一商家同一日期下的时段重叠,当前的条件其实不够全面——比如如果有一条记录是09:00-15:00,它完全包含了你要检查的10:00-14:00时段,但你的条件会漏掉这种情况。更完整的时段重叠判断逻辑应该是:

SELECT * FROM merchant_slots 
WHERE merchantId='14955' 
AND day='2' 
AND (
    start_time < '14:00' 
    AND end_time > '10:00'
)

这个逻辑能覆盖所有重叠场景:

  • 目标时段包含记录时段
  • 记录时段包含目标时段
  • 两者部分重叠

验证效果

用修正后的语句查询day='2'时,因为表中没有对应日期的数据,会返回空结果,完全符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 06:27:38