我有以下示例数据
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与另一对相同的数据本身重叠)
请帮帮我..
答案 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;