使用 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]
重叠,至少 c
或 d
将介于 a
和 b
之间。
我有一个 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]
重叠,至少 c
或 d
将介于 a
和 b
之间。