Oracle APEX中防止会议室预订时间重叠的SQL查询需求
Oracle APEX会议室预订冲突检测SQL修正
你的现有查询未覆盖新预订区间完全包含已有预订的冲突场景,要解决这个问题,需要重新梳理时间区间重叠的判断逻辑——只要两个时间区间存在任何形式的重叠,就判定为冲突。
问题分析
现有查询的条件逻辑有误,它试图通过反向判断排除无冲突情况,但漏掉了新区间完全包裹已有区间的场景。正确的冲突判断应该聚焦于「区间是否存在重叠」,同时必须限定是同一个会议室(避免不同会议室的时间重叠误判)。
修正后的查询
SELECT RES_ID_LOC FROM WER_RES WHERE RES_ID_LOC = :TRY_RESERVE_ROOM_ID -- 限定冲突检测仅针对同一会议室 AND CAST(:TRY_RESERVE_START_DATE AS DATE) < CAST(RES_DATE_DEPART AS DATE) AND CAST(:TRY_RESERVE_END_DATE AS DATE) > CAST(RES_DATE_ARRIVE AS DATE)
逻辑说明
这个查询会返回所有与新预订存在时间重叠的同会议室已有预订,覆盖所有冲突场景:
- 新预订完全包含已有预订(如已有[2-5],新[1-7]):
1 < 5且7 > 2,满足条件,检测到冲突 - 已有预订包含新预订(如已有[1-7],新[2-5]):
2 <7且5>1,满足条件 - 新预订与已有预订部分重叠(如已有[2-5],新[3-6]或[1-3]):同样满足条件
若查询返回结果,说明存在冲突,不允许提交新预订;若无返回结果,则可正常完成预订。
内容的提问来源于stack exchange,提问作者ProgrammingPadawan
相关产品推荐
相关产品推荐

