我试图在sql数据库中找到时隙冲突。该表的一个例子是:
id | startTime | endTime
---+-----------+---------
1 | 09:00:00 | 10:00:00
2 | 10:00:00 | 10:20:00
我工作的声明是为了返回拟议的一个插槽将与之冲突的插槽数量,它是
SELECT COUNT(*) FROM Slots WHERE (endTime > #{start} AND endTime <= #{end}) OR (startTime >= #{start} AND startTime < #{end})
但是这并不能解释现有广告位内的时段,例如,如果我尝试预订从09:15
到09:45
的广告位,则系统无法检测到与第一个插槽冲突。
另一个设计要求是,如果一个插槽在11:00
完成而另一个插槽同时启动,则不存在任何冲突。
答案 0 :(得分:2)
假设新的插槽是(开始,结束)=(s2,e2),将问题分解为更小/更简单的问题:
检查s2是否属于时间段,即:
SELECT COUNT(*) FROM Slots WHERE (endTime > s2 AND startTime < s2)
检查e2时间是否落入时间段:
SELECT COUNT(*) FROM Slots WHERE (endTime > e2 AND startTime < e2)
上述两个肯定是冲突,并处理时间部分重叠的所有情况。但是,它不会检查新插槽(s2,e2)是否环绕现有插槽,所以
查看现有广告位是否属于新广告位:
SELECT COUNT(*) FROM Slots WHERE (endTime < e2 AND startTime > s2)
您可以将所有三个组合在一个查询中(使用OR),我认为它应该可以工作(未经过测试)。平等已被删除,以处理插槽完成和同时开始
SELECT COUNT(*) FROM Slots WHERE
(endTime > #{start} AND startTime < #{start})
OR
(endTime > #{end} AND startTime < #{end})
OR
(endTime < #{end} AND startTime > #{start})
答案 1 :(得分:0)
试试吧
SELECT COUNT(*) FROM Slots WHERE
(startTime > #{end} AND endTime > #{end})
OR
(startTime < #{start} AND endTime < #{start})
答案 2 :(得分:0)
你正在做的事情是正确的,只有滑动条件改变如下:
SELECT COUNT(*)FROM Slots WHERE endTime&lt;#{start} AND startTime&gt; #{端}
希望这对你有所帮助,祝你有个美好的一天: - )
答案 3 :(得分:0)
最简单的逻辑是:
SELECT COUNT(*)
FROM Slot
WHERE endTime > #{start} AND startTime < #{end}
我不确定正确的逻辑是>
还是>=
。逻辑很简单:当一个时间段在第二个结束之前开始时,两个时间段重叠,而第一个时间段在第二个结束之后结束。