我目前正在开发一个事件管理系统,其中数据库存储时隙如下:
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&3和时隙1&3不会冲突。我们如何编写SQL语句来检测两个时隙之间的冲突?
也许我很困惑,但看起来这三个时隙都重叠了。因为它们分别从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