DateTime三日期重叠冲突检测如何排除边界点误报问题
时段冲突检测边界误报解决方案
问题根源
你当前使用的是左右双闭区间的重叠判定逻辑,默认时间块的结束时间点属于该时间块的覆盖范围,才会出现边界点重合被判定为重叠的误报。你的业务场景下,边界点的重合不属于有效冲突,本质是需要把时间块定义为左闭右开区间:即时间块[start, end)仅覆盖大于等于start、小于end的时间点,end点本身不属于该时间块。
调整方案
1. 双时段重叠判定逻辑修改
把原有判定代码:
Datestart <= @DateEndToTest AND DateEnd >= @DateStartToTest
修改为:
Datestart < @DateEndToTest AND DateEnd > @DateStartToTest
2. 逻辑验证(以你给出的示例为例)
三个时间块按左闭右开定义后为:
- B1:[2021-12-24 00:00:00, 2021-12-25 00:00:00)
- B2:[2021-12-25 00:00:00, 2021-12-26 00:00:00)
- B3:[2021-12-24 00:00:00, 2021-12-26 00:00:00)
边界点2021-12-25 00:00:00仅属于B2、B3的覆盖范围,B1的覆盖范围不包含该点,同时共存的时间块数量为2,不会触发超过2的报警要求。
3. 多时段批量检测优化(可选)
如果需要批量检测所有时间点的共存数量,推荐使用扫描线算法,从根源避免边界误报:
- 把所有时间块的start事件标记为
+1,end事件标记为-1 - 所有事件按时间戳排序,相同时间戳的end事件排在start事件之前
- 遍历事件累加计数,累加过程中数值峰值超过2的区间即为需要上报的冲突区间
内容的提问来源于stack exchange,提问作者BigBenne
相关产品推荐
相关产品推荐

