如何编写SQL查询校验两段时间区间是否存在预订冲突
解决时间区间预订冲突的SQL查询修改方案
你当前的查询仅校验了传入区间的起始时间是否落在已有预订区间内,要判断整个传入区间是否和已有预订存在重叠(即是否已被预订),需要覆盖所有可能的区间冲突场景,以下是两种可行的修改方案:
方案1:枚举所有重叠场景
直接列出三种区间重叠的情况,用OR连接:
SELECT * FROM tbl_booking WHERE -- 传入的起始时间落在已有预订区间内 '2023-12-13 06' BETWEEN startDate AND endDate -- 传入的结束时间落在已有预订区间内 OR '2023-12-14 21' BETWEEN startDate AND endDate -- 已有预订区间完全被传入区间包含 OR (startDate BETWEEN '2023-12-13 06' AND '2023-12-14 21')
方案2:更紧凑的重叠判断公式(推荐)
利用区间重叠的反向逻辑:两个区间不重叠的情况只有两种——传入区间完全在已有区间之前(传入结束时间 ≤ 已有起始时间),或完全在之后(传入起始时间 ≥ 已有结束时间)。反过来,只要不满足这两种情况,就说明区间存在重叠:
SELECT * FROM tbl_booking WHERE '2023-12-13 06' < endDate AND '2023-12-14 21' > startDate
进阶:直接返回校验结果
如果不需要查询具体的预订记录,只想直接得到「是否已被预订」的布尔值(true/false),可以用EXISTS子查询:
SELECT EXISTS( SELECT 1 FROM tbl_booking WHERE '2023-12-13 06' < endDate AND '2023-12-14 21' > startDate ) AS is_booked;
内容的提问来源于stack exchange,提问作者vellai durai
相关产品推荐
相关产品推荐

