我有一张保存日期的表
ID Dates
1 2014-01-20
2 2014-01-21
...
100 2014-05-20
101 2014-06-01 --Missing a few dates
102 2014-06-02
...
201 2014-10-31
202 2014-12-05 --Missing a few dates
...
349 2015-04-29
350 2015-04-30
我想找到一个从年初到现在的可用日期范围,例如
@StartDate: 2014/04/06
@EndDate: 2015/04/05
预期结果是
Year StartRange EndRange
2014 2014-04-06 2014-05-20
2014 2014-06-01 2014-10-31
2014 2014-12-05 2014-12-31
2015 2015-01-01 2015-04-05
我正在尝试从日期列中找到可用的日期范围。让我们把预期结果中的第一行 2014-04-06改为2014-05-20 ,这表示我从4月6日到5月20日有连续的日期然后休息(我没有日期2014-05-21至2014-05-30)
日期 2014-04-06 (在第一行)和 2015-04-05 (在最后一行)包含在预期结果中,因为它是开始和结束日期(查询的参数),我在表格的[日期]列中有这些日期
由于
答案 0 :(得分:0)
这是一个"群岛和差距"问题的类型。这是一种方法:
;
WITH
cteDays As (SELECT *, DATEDIFF(dd,0,Dates) As DayNo From YourTable)
, cteDifs As
(
SELECT *,
DayNo-(ROW_NUMBER() OVER(ORDER BY Dates, ID)) As Dif
FROM cteDays
)
SELECT
Year(Dates) As [Year],
MIN(Dates) As StartRange,
MAX(Dates) As EndRange
FROM cteDifs
GROUP BY Year(Dates), Dif
ORDER BY [Year], StartRange