从日期设置中获取日期范围差距

sql*_*ser 6 sql t-sql sql-server sql-server-2016

这是我们的设定

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
Run Code Online (Sandbox Code Playgroud)

我们希望每个月都缺少日期范围.所以输出将是这样的:

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
Run Code Online (Sandbox Code Playgroud)

请注意我们之间缺少日期2018-04-30,2018-05-04但输出应分别在每个月的范围内.

谢谢.

Tim*_*sen 5

这是一个经典的间隙和岛屿问题。我选择使用相关子查询以老派方式解决这个问题:

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);
Run Code Online (Sandbox Code Playgroud)

演示