我有一个约会表,每个约会都有start_time和end_time。有没有一种有效的方法来使用SQL Server查找重叠约会?
答案 0 :(得分:1)
以下是查找与下一个约会重叠的任何约会的一种方法:
select a.*
from (select a.*, lead(start_time) over (order by start_time, id) as next_start_time
from appointments a
) a
where next_start_time < end_time;
答案 1 :(得分:1)
这是一个简单的连接:
DECLARE @t TABLE ( ID INT, ST TIME, ET TIME )
INSERT INTO @t
VALUES ( 1, '8:00', '9:00' ),
( 2, '9:00', '10:00' ),
( 3, '12:00', '13:00' ),
( 4, '12:30', '13:30' ),
( 5, '13:10', '13:20' ),
( 6, '14:00', '15:00' )
SELECT t1.ID, t2.ID
FROM @t t1
JOIN @t t2 ON t1.ID < t2.ID
AND (t1.ST > t2.ST
AND t1.ST < t2.ET
OR t1.ET > t2.ST
AND t1.ET < t2.ET)
输出:
ID1 ID2
3 4
4 5
这里的想法是当至少一条线的边缘位于另一条线的边缘之间时找到线:
a--------------------b
c-------------d
a--------------------b
c-------------d
a--------------------b
c--------d
如果[cd]
重叠[ab]
,则至少c
或d
将介于a
和b
之间。