2

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

@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 日,而不是持续到 2015 年 5 月 2 日期末?是否有可能包括最后一个时期的剩余时间 - 2015/01/01 - 2015/02/05,即使它不是一年?

4

2 回答 2

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 个值。

于 2013-06-21T14:45:43.450 回答
-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)

演示

于 2013-06-21T14:55:17.927 回答