
使用 SQL 检测连续日期范围
要识别包含日期序列的列中的连续日期范围,可以使用 SQL 来有效提取开始日期和结束日期每个不同范围的。
考虑以下数据集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | InfoDate
2013-12-04
2013-12-05
2013-12-06
2013-12-09
2013-12-10
2014-01-01
2014-01-02
2014-01-03
2014-01-06
2014-01-07
2014-01-29
2014-01-30
2014-01-31
2014-02-03
2014-02-04
|
登录后复制
目标是提取每个连续日期范围的开始和结束日期,结果是:
1 2 3 4 5 6 7 8 | StartDate EndDate
2013-12-04 2013-12-06
2013-12-09 2013-12-10
2014-01-01 2014-01-03
2014-01-06 2014-01-07
2014-01-29 2014-01-31
2014-02-03 2014-02-04
|
登录后复制
可以使用以下步骤设计一个简化且高效的 SQL 解决方案:
- 分配一个InfoDate 列中每个日期的唯一行号,创建一个名为 t 的辅助表。此编号有助于对连续日期进行分组。
- 根据日期与其相应行号之间的差异对 t 中的行进行分组。这种分组会在日期序列中产生“间隙”。
- 在每个组中,最小和最大日期代表连续日期范围的开始和结束日期。
SQL实现此目的的查询是:
1 2 3 4 5 6 7 8 | WITH t AS (
SELECT InfoDate d,ROW_NUMBER() OVER(ORDER BY InfoDate) i
FROM @d
GROUP BY InfoDate
)
SELECT MIN(d),MAX(d)
FROM t
GROUP BY DATEDIFF(day,i,d)
|
登录后复制
以上是如何在 SQL 中识别连续的日期范围?的详细内容。更多信息请关注PHP中文网其他相关文章!