C# SQL查询问题:预约时间重叠检测逻辑异常排查
问题根源
你当前使用的查询条件AssignStartTime >= 新增开始时间 AND AssignEndTime <= 新增结束时间,仅能检测已有时间段完全被新增时间段包含的场景,无法覆盖部分重叠的情况,这就是部分重叠预约无法被检测到的核心原因。
正确的时间重叠判断逻辑
两个时间段(已有时间段S1-E1,新增时间段S2-E2)存在重叠的标准判断逻辑是:
新增时间段的开始时间 < 已有时间段的结束时间 且 新增时间段的结束时间 > 已有时间段的开始时间
对应的SQL语句如下:
SELECT * FROM tblAssignDoctor WHERE AssignEndTime > '新增开始时间' AND AssignStartTime < '新增结束时间'
验证你的场景
针对你提到的两种无法检测的情况:
新增预约:03-Aug-22 9:00:00 AM 至 03-Aug-22 12:00:00 PM
代入条件后:AssignEndTime > '03-Aug-22 9:00:00 AM' AND AssignStartTime < '03-Aug-22 12:00:00 PM'
已有数据的AssignEndTime为12:00 PM(大于9:00 AM),AssignStartTime为8:00 AM(小于12:00 PM),条件成立,能正常查到数据。新增预约:03-Aug-22 8:00:00 AM 至 03-Aug-22 11:00:00 AM
代入条件后:AssignEndTime > '03-Aug-22 8:00:00 AM' AND AssignStartTime < '03-Aug-22 11:00:00 AM'
已有数据的AssignEndTime为12:00 PM(大于8:00 AM),AssignStartTime为8:00 AM(小于11:00 AM),条件成立,能正常查到数据。
补充:端点重合的处理
如果业务需要把时间段端点完全重合的情况也算作重叠(比如已有预约结束于12:00 PM,新增预约开始于12:00 PM),可以将判断条件调整为:
SELECT * FROM tblAssignDoctor WHERE AssignEndTime >= '新增开始时间' AND AssignStartTime <= '新增结束时间'
具体是否包含端点,可根据实际业务规则决定。
内容的提问来源于stack exchange,提问作者Eric

