如何验证预订时段?实现新增时段与已有预订无重叠校验
预订时段冲突验证方案
现有预订数据
| id | start_date | end_date |
|---|---|---|
| 1 | 2022-10-10 11:00:00 | 2022-10-10 15:00:00 |
你的需求是阻止用户添加与已有预订时段重叠的新预订,核心是判断新时段和已有预订是否存在时间交集,以下是具体验证方案:
1. 数据库层面验证(最可靠,规避并发冲突)
直接通过SQL查询判断是否存在冲突记录,假设用户提交的新预订时段为new_start和new_end,执行如下查询:
SELECT COUNT(*) FROM 预订表 WHERE start_date < :new_end AND end_date > :new_start;
如果查询结果大于0,说明存在时段重叠,直接返回错误,阻止插入操作。
逻辑说明:只要新时段的结束时间晚于已有预订的开始时间,且新时段的开始时间早于已有预订的结束时间,就代表两个时段存在重叠。
2. 应用层面验证(前置校验,提升用户体验)
在用户提交表单后、调用数据库之前,先做一次前置校验:
- 先拉取与新预订日期相同的已有记录(缩小查询范围,提升效率)
- 遍历记录逐一判断时间是否重叠,伪代码示例:
如果返回def has_time_conflict(existing_bookings, new_start, new_end): for booking in existing_bookings: # 校验时段是否重叠 if new_start < booking['end_date'] and new_end > booking['start_date']: return True return FalseTrue,则提示用户“该时段已被预订,请选择其他时间”,阻止提交。
额外优化建议
- 前端可提前做简单校验:提前加载当日已预订时段,限制用户选择的时段不能完全落在已有预订范围内,减少无效请求。
- 数据库可添加触发器或唯一约束,进一步保障并发场景下的数据一致性,避免多用户同时提交同一时段预订的冲突。
内容的提问来源于stack exchange,提问作者stackover flow
相关产品推荐
相关产品推荐

