MySQL查询:如何检测指定日期的预订是否不在允许时间段内
检测不在允许时间段内的预订
我懂你遇到的问题了——用常规的start_datetime >=这类单一条件判断,很容易漏掉那些和允许时间段部分重叠或者完全在禁订区间的情况,毕竟时间区间的重叠逻辑比想象中要复杂一点。
核心思路
我们要找的是指定日期内,整个预订时间段完全不与任何允许时间段重叠的记录。反过来想:先找出所有和至少一个允许时间段有重叠的合规预订,再取反就能得到违规的那些。
假设场景
假设你的bookings表包含start_datetime(预订开始时间)和end_datetime(预订结束时间)字段,现在要检测2024-05-20这一天的违规预订,允许的时间段是09:00-12:00和14:00-18:00。
直接写死允许时间段的查询
SELECT * FROM bookings WHERE DATE(start_datetime) = '2024-05-20' -- 锁定要检测的日期 AND NOT ( -- 预订与上午允许时间段有重叠 (start_datetime < '2024-05-20 12:00:00' AND end_datetime > '2024-05-20 09:00:00') OR -- 预订与下午允许时间段有重叠 (start_datetime < '2024-05-20 18:00:00' AND end_datetime > '2024-05-20 14:00:00') );
允许时间段存表的动态查询
如果允许时间段是存在allowed_time_ranges表(结构:date(日期)、start_time(开始时间)、end_time(结束时间))里的,用EXISTS关联查询更灵活:
SELECT b.* FROM bookings b WHERE DATE(b.start_datetime) = '2024-05-20' AND NOT EXISTS ( SELECT 1 FROM allowed_time_ranges atr WHERE atr.date = DATE(b.start_datetime) -- 判断预订和当前允许时间段是否重叠 AND b.start_datetime < CONCAT(atr.date, ' ', atr.end_time) AND b.end_datetime > CONCAT(atr.date, ' ', atr.start_time) );
为什么常规条件不行?
比如你之前可能只写了start_datetime >= '2024-05-20 18:00'或者end_datetime <= '2024-05-20 09:00',这会漏掉中间禁订时段(比如12:00-14:00)的预订。上面的逻辑覆盖了所有“完全不重叠”的情况:不管预订是在早上9点前、中午12-14点,还是晚上18点后,都会被准确筛选出来。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

