2

たとえば、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 の最終期間の残りの期間が 1 年ではありませんが、含まれる可能性はありますか?

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 に答える