识别SQL Server中的重叠时间段

时间:2014-09-01 14:26:25

标签: sql sql-server tsql

我有以下示例数据

begin_date              end_date
-------------------------------------------
2014-08-27 07:10:00     2014-08-27 07:30:00
2014-08-27 07:30:00     2014-08-27 07:50:00
2014-08-27 07:40:00     2014-08-27 08:00:00
2014-08-27 07:50:00     2014-08-27 08:10:00
2014-08-27 08:10:00     2014-08-27 08:30:00
2014-08-27 08:30:00     2014-08-27 08:50:00
2014-08-27 08:30:00     2014-08-27 08:50:00

我想确定重叠的时间段。

预期输出

2014-08-27 07:30:00     2014-08-27 07:50:00
2014-08-27 07:40:00     2014-08-27 08:00:00
2014-08-27 07:50:00     2014-08-27 08:10:00
2014-08-27 08:30:00     2014-08-27 08:50:00
2014-08-27 08:30:00     2014-08-27 08:50:00

(2014-08-27 08:30:00 2014-08-27 08:50:00与另一对相同的数据本身重叠)

请帮帮我..

2 个答案:

答案 0 :(得分:2)

两个时间段A和B重叠iff (begin(A) < end(B)) && (end(A) >= begin(B))。这有帮助吗?

也许尝试这样的事情:

select p1.begin_date, p1.end_date, ' overlaps ', p2.begin_date, p2.end_date
from periodTable p1
inner join periodTable p2
    on p1.begin_date < p2.end_date
    and p1.end_date >= p2.begin_date

编辑:

回应Tanner的评论,我建议详细说明以上内容:

select p1.begin_date, p1.end_date
from periodTable p1
inner join periodTable p2
    on p1.begin_date < p2.end_date
    and p1.end_date > p2.begin_date
group by p1.begin_date, p1.end_date
having count(*) > 1

这将产生所有重叠的期间,但来自表格中的各个记录,也就是说,每个期间只会返回一次。 (这对应于纯粹的关系代数视图,是缺少主键的结果。)

答案 1 :(得分:0)

试试这个:

SELECT  REsult.DtFrom, REsult.DtTo
FROM
(
SELECT DtFrom, DtTo, CASE WHEN DtFrom <= cast((LAG(DtTo) OVER(ORDER BY DtFrom, DtTo)) as datetime)
THEN 1 ELSE 0 END AS IsOverlapping
 FROM 
dbo.Dates_Overlap
) AS REsult
WHERE IsOverlapping = 1 
ORDER BY DtFrom, DtTo;