可用日期范围逐年

时间:2015-01-20 19:08:10

标签: sql sql-server sql-server-2008-r2

我有一张保存日期的表

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 (在最后一行)包含在预期结果中,因为它是开始和结束日期(查询的参数),我在表格的[日期]列中有这些日期

由于

1 个答案:

答案 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