使用SQL Server查找重叠约会

时间:2015-03-09 02:38:55

标签: sql-server overlap

我有一个约会表,每个约会都有start_time和end_time。有没有一种有效的方法来使用SQL Server查找重叠约会?

2 个答案:

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