使用 SQL 服务器查找重叠约会

Find overlapping appointments using SQL Server

我有一个 table 的约会,每个约会都有 start_time 和 end_time。有没有使用 SQL 服务器查找重叠约会的有效方法?

这是一种查找与下一个约会重叠的约会的方法:

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;

这是一个简单的连接:

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] 重叠,至少 cd 将介于 ab 之间。