【发布时间】:2014-04-16 00:24:40
【问题描述】:
我有这个示例数据集
ID StartDate EndDate
------------------------------
1 2014-01-05 2014-01-10
2 2014-01-06 2014-01-11
3 2014-01-07 2014-01-12
4 2014-01-08 2014-01-13
5 2014-01-09 2014-01-14
6 2014-01-26 2014-01-31
7 2014-01-27 2014-02-01
8 2014-01-28 2014-02-02
9 2014-01-29 2014-02-03
10 2014-01-30 2014-02-04
我想选择与提供的时间段重叠的任何行,以及与之重叠的任何行,依此类推。
所以如果我想选择任何超过 2014-01-06 到 2014-01-07 的行数
以下是直接重叠(立即重叠)
1 2014-01-05 2014-01-10
2 2014-01-06 2014-01-11
但我还需要与 1 和 2 重叠的行(子重叠)
3 2014-01-07 2014-01-12
4 2014-01-08 2014-01-13
5 2014-01-09 2014-01-14
如果 3 到 5 有重叠,也返回它们。但在这种情况下,没有。
这是我目前的尝试,但它有两个我不知道如何解决的问题。
;WITH cte
AS
(
SELECT t.ID,
t.StartTime,
t.EndTime
FROM
dbo.Tasks AS t
UNION ALL
SELECT t.ID,
t.StartTime,
t.EndTime
FROM
dbo.Tasks AS t INNER JOIN
cte AS c ON t.StartTime < c.EndTime
AND t.EndTime > c.StartTime
)
SELECT * FROM cte AS a WHERE a.StartTime < @NewEnd
AND a.EndTime > @NewStart
当获取子重叠的重叠时段时,立即重叠被重新包含并导致无限递归。其次,
SELECT * FROM cte AS a WHERE a.StartTime < @NewEnd
AND a.EndTime > @NewStart
where 子句将过滤掉任何递归发现的重叠。
【问题讨论】:
标签: sql sql-server recursion common-table-expression