我目前正在开发一个事件管理系统,数据库存储时间段:
SlotId | DateTime | Duration
-------+---------------------+---------------
1 | 2011-06-06 15:00:00 | 5.0
2 | 2011-06-06 14:00:00 | 3.0
3 | 2011-06-07 11:00:00 | 8.0
请注意,Duration
为DOUBLE
小时,DateTime
为TIMESTAMP
。
在表格中,我们可以清楚地看到时隙1和2发生冲突,而时隙2和2则发生冲突。 3和时隙1& 3不会发生冲突。我们如何编写SQL语句来检测两个时隙之间的冲突?
答案 0 :(得分:1)
也许我很困惑,但看起来这三个时间段都重叠了。因为他们分别从11:00 - 19:00,14:00-17:00和15:00 - 20:00(按照您的顺序,按时间顺序按开始时间)。但是,如果我正确理解你的表,这里是找到重叠的代码
SELECT CONCAT(T1.SlotId, ' Overlaps ', T2.SlotId)
FROM YourTable AS T1 JOIN YourTable AS T2
WHERE T1.SlotId <> T2.SlotId AND
T1.DateTime <= T2.DateTime AND
DATE_ADD(T1.DateTime,INTERVAL SEC_TO_TIME(T1.Duration * 3600) HOUR_SECOND) > T2.DateTime