【发布时间】:2016-06-01 19:12:50
【问题描述】:
如何在没有循环的情况下计算 SQL 中任意数量时间序列的日期交集?
鉴于我有一个包含 3 列的表格
- GroupId
- 开始日期
- 结束日期
对于每个 GroupId 有多个行 - 因此每个 GroupId 有多个开始/结束日期(在一个组内没有重叠)
我想做的是找到所有组之间的所有相交日期 所以如果第 1 组有以下日期
1/1/2001 - 1/31/2001
3/31/2001 - 4/5/2001
第 2 组有以下内容
1/25/2001 - 5/1/2001
第 3 组有以下内容
1/22/2001 - 4/1/2001
以上所有相交于:
1/25/2001 - 1/31/2001
3/31/2001 - 1/4/2001
如何在 SQL 中执行此操作?以下是一张表中 2 个日期范围的逻辑,但我需要一张表中的 n 个日期范围:
SELECT
case
when t1.StartDate > t2.StartDate then t1.StartDate
else t2.StartDate
END as StartDate,
CASE WHEN t1.EndDate < t2.EndDate THEN t1.EndDate
ELSE t2.EndDate
END as EndDate
FROM Table1 t1
JOIN Table1 t2 ON t1.StartDate <= t2.EndDate AND t1.EndDate >= t2.StartDate
(注意:作为附加约束,我在 linq to sql 中执行此操作)
提前致谢
【问题讨论】:
-
提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。
标签: sql tsql sql-server-2012 time-series