识别SQL Server中的重叠时间段
我有以下示例数据识别SQL Server中的重叠时间段,sql,sql-server,tsql,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-
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与另一对相同数据本身重叠)
请帮我解决一下。当iff
(begin(A)=begin(B))时,A和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
选择p1.开始日期、p1.结束日期、“重叠”、p2.开始日期、p2.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期=p2.begin\u 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
选择p1.开始日期、p1.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期p2.开始日期
按p1.开始日期、p1.结束日期分组
计数(*)大于1的
这将产生所有重叠的时段,但不会产生表中的单个记录,也就是说,每个时段只返回一次。(这对应于纯粹的关系代数视图,是缺少主键的结果。)两个时间段a和B重叠iff(begin(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
选择p1.开始日期、p1.结束日期、“重叠”、p2.开始日期、p2.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期=p2.begin\u 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
选择p1.开始日期、p1.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期p2.开始日期
按p1.开始日期、p1.结束日期分组
计数(*)大于1的
这将产生所有重叠的时段,但不会产生表中的单个记录,也就是说,每个时段只返回一次。(这对应于纯粹的关系代数视图,是缺少主键的结果。)两个时间段a和B重叠iff(begin(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
选择p1.开始日期、p1.结束日期、“重叠”、p2.开始日期、p2.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期=p2.begin\u 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
选择p1.开始日期、p1.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期p2.开始日期
按p1.开始日期、p1.结束日期分组
计数(*)大于1的
这将产生所有重叠的时段,但不会产生表中的单个记录,也就是说,每个时段只返回一次。(这对应于纯粹的关系代数视图,是缺少主键的结果。)两个时间段a和B重叠iff(begin(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
选择p1.开始日期、p1.结束日期、“重叠”、p2.开始日期、p2.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期=p2.begin\u 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
选择p1.开始日期、p1.结束日期
从周期表p1
内部联接周期表p2
p1.开始日期p2.开始日期
按p1.开始日期、p1.结束日期分组
计数(*)大于1的
这将产生所有重叠的时段,但不会产生表中的单个记录,也就是说,每个时段只返回一次。(这与纯粹的关系代数视图相对应,是缺少主键的结果。)尝试以下方法:
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;
选择REsult.DtFrom,REsult.DtTo
从…起
(
选择DtFrom、DtTo、CASE WHEN DtFrom尝试以下操作:
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;
选择REsult.DtFrom,REsult.DtTo
从…起
(
选择DtFrom、DtTo、CASE WHEN DtFrom尝试以下操作:
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;
选择REsult.DtFrom,REsult.DtTo
从…起
(
选择DtFrom、DtTo、CASE WHEN DtFrom尝试以下操作:
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;
选择REsult.DtFrom,REsult.DtTo
从…起
(
选择DtFrom,DtTo,CASE WHEN DtFrom当然,如果您对源数据运行它,它会返回18行而不是预期的输出:。我猜您没有测试它?好的,我明白您的意思。谢谢检查。是的,我只是在没有测试它的情况下抛出了SQL。但是,它工作正常。-当然,您会得到所有重叠的组合结果是句点,但这是一个很容易适应所需输出格式的示例。两个要点是a)必须将表连接到自身,以及b)如何比较间隔。“a”是大约一半的SQL问题的答案,以及“b”是针对这个问题的。这两个概念结合起来解决了OP的问题,而投影的最终选择是微不足道的。Thaks,这为我今天节省了很多时间!!当然,如果对源数据运行它,它将返回18行而不是预期的输出:。我猜你没有测试它?好的,我明白你的意思。谢谢你的检查。是的,我只是在没有测试的情况下加入了SQL。但是,它的工作原理与预期一样。-当然,结果是所有重叠时段的组合,但这是一个很容易适应所需输出格式的示例。两个要点是a)必须将表连接到自身,以及b)如何比较间隔。“a”是关于SO的大约一半SQL问题的答案,“b”是针对这个问题的。这两个概念的结合解决了OP的问题,而投影的最终选择是微不足道的。Thaks,这为我今天节省了很多时间!!当然,如果您针对源数据运行它,那么