PHP实现娱乐设施预订时间重叠拦截的方案问询
解决娱乐设施预订的日期重叠检测问题
你目前的SQL只能检测新预订完全被已有预订包含的情况,但实际预订重叠有多种场景——比如新预订的结束日期落入已有区间、新预订开始在已有区间内、甚至新预订完全覆盖已有预订,这些都需要拦截。
所有日期区间重叠的核心判断逻辑是:新预订的开始日期 ≤ 已有预订的结束日期,且新预订的结束日期 ≥ 已有预订的开始日期。这个逻辑可以覆盖所有可能的重叠场景,不用拆分多种情况逐一判断。
对应的SQL查询语句应该改成:
SELECT * FROM reservations WHERE facility = :facility AND :begDate <= endDate AND :endDate >= begDate;
逻辑说明
只要新预订的时间区间和已有预订的区间有任何交集,这个查询就会返回对应的已有预订记录:
- 如果新预订的开始日期在已有区间内,
:begDate <= endDate和:endDate >= begDate都会成立 - 如果新预订的结束日期在已有区间内,同样满足两个条件
- 如果新预订完全覆盖已有预订,或者完全被已有预订包含,也会触发条件
执行这个查询后,只要结果集不为空,就说明当前设施在目标时间段已有冲突预订,直接阻止新预订即可。
内容的提问来源于stack exchange,提问作者papalatong.dev
相关产品推荐
相关产品推荐

