sql - 从日期集中获取日期范围间隔
问题描述
这是我们的集合
Date
-----------
2018-04-01
2018-04-02
2018-04-18
2018-04-19
2018-04-21
2018-04-22
2018-04-23
2018-04-24
2018-04-25
2018-04-26
2018-04-27
2018-04-28
2018-04-29
2018-05-05
2018-05-06
2018-05-07
2018-05-08
2018-05-09
2018-05-28
2018-05-29
2018-05-30
2018-05-31
我们希望每个月都缺少日期范围。所以输出将是这样的:
start_date end_date
------------------------
2018-04-03 2018-04-17
2018-04-20 2018-04-20
2018-04-30 2018-04-30
2018-05-01 2018-05-04
2018-05-10 2018-05-27
请注意,我们缺少2018-04-30
截至之间的日期,2018-05-04
但输出应分别在每个月范围内。
谢谢。
解决方案
这是一个典型的差距和孤岛问题。我选择使用相关子查询来解决这个问题:
WITH cte AS (
SELECT t1.Date, ROW_NUMBER() OVER (ORDER BY t1.Date) rn,
FROM yourTable t1
WHERE NOT EXISTS (SELECT TOP 1 t2.Date FROM yourTable t2
WHERE t2.Date = DATEADD(day, -1, t1.Date)) OR
NOT EXISTS (SELECT TOP 1 t2.Date FROM yourTable t2
WHERE t2.Date = DATEADD(day, 1, t1.Date))
)
SELECT
DATEADD(day, 1, MIN(Date)) AS start_date,
DATEADD(day, -1, MAX(Date)) AS end_date
FROM cte
WHERE rn > 1
GROUP BY rn / 2
HAVING MIN(Date) <> MAX(Date);
演示
推荐阅读
- mongodb - 无法使用 $toString 将数字转换为字符串
- swift - 不同的导航项
- excel - 使用 UiPath 在 Excel 文件中循环 URL
- python - 根据其他形式的值在循环中重复烧瓶形式
- javascript - 有没有办法检查两个对象是否具有共同的属性?
- javascript - 未应用 Datatables.js 样式
- python - Python:for循环迭代对象,而不是字符串
- java - 我的 KeyListener 无法读取按键输入
- python - Python 字符串,默认编码和解码(UTF-8?)
- javascript - 更改代表获取行 ID 的按钮名称