Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
识别SQL Server中的重叠时间段_Sql_Sql Server_Tsql - Fatal编程技术网

识别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,这为我今天节省了很多时间!!当然,如果您针对源数据运行它,那么