SQL-如何将两个日期拆分为年度格式

时间:2013-06-21 14:34:12

标签: sql sql-server common-table-expression

如果我有两个日期,例如:

@StartDate = '2009/01/01'
@EndDate = '2015/02/05'

有没有办法以这种格式显示:

StartDate             EndDate
2009/01/01            2010/01/01 
2010/01/01            2011/01/01
2011/01/01            2012/01/01
2012/01/01            2013/01/01
2013/01/01            2014/01/01
2014/01/01            2015/01/01
2015/01/01            2015/02/05 <--- most importantly end using the end date
这可能吗?因为我看过一些CTE代码片段,但它们只分成2015年1月1日,而不是继续到05/02/2015期间结束?是否有可能包括最后一期的剩余时间 - 2015/01/01 - 2015/02/05,即使它不是一年?

2 个答案:

答案 0 :(得分:3)

这是一种方式:

with nums as (
      select 0 as n
      union all
      select 1 + n
      from nums
      where n < 100
     )
select DATEADD(year, n, @StartDate) as StartDate,
       (case when DATEADD(year, n+1, @StartDate) >= @EndDate then @EndDate
             else DATEADD(year, n+1, @StartDate)
        end) as EndDate
from nums
where dateadd(year, nums.n, @StartDate) < @EndDate

如果您的期间很长,则可能需要将nums扩展到超过100个值。

答案 1 :(得分:-1)

DECLARE @StartDate DATETIME = '2009/01/01'
DECLARE @EndDate DATETIME = '2015/02/05'

;WITH Dates AS
(
    SELECT
         StartDate = @StartDate,
         EndDate = DATEADD(YEAR, 1, @StartDate)
    UNION ALL
    SELECT
        StartDate = DATEADD(YEAR, 1, StartDate),
        EndDate = CASE 
                        WHEN DATEADD(YEAR, 1, EndDate) > @EndDate 
                             AND DATEADD(YEAR, -1, EndDate) < DATEADD(YEAR, -1, @EndDate)  THEN @EndDate
                        ELSE DATEADD(YEAR, 1, EndDate) 
                    END
    FROM Dates
    WHERE EndDate < @EndDate
)

SELECT * FROM dates
OPTION (MAXRECURSION 0)

demo