Generating a range of dates
Generating Date Range With Recursive CTE
Section titled “Generating Date Range With Recursive CTE”Using a Recursive CTE, you can generate an inclusive range of dates:
Declare @FromDate Date = '2014-04-21', @ToDate Date = '2014-05-02'
;With DateCte (Date) As( Select @FromDate Union All Select DateAdd(Day, 1, Date) From DateCte Where Date < @ToDate)Select DateFrom DateCteOption (MaxRecursion 0)The default MaxRecursion setting is 100. Generating more than 100 dates using this method will require the Option (MaxRecursion N) segment of the query, where N is the desired MaxRecursion setting. Setting this to 0 will remove the MaxRecursion limitation altogether.
Generating a Date Range With a Tally Table
Section titled “Generating a Date Range With a Tally Table”Another way you can generate a range of dates is by utilizing a Tally Table to create the dates between the range:
Declare @FromDate Date = '2014-04-21', @ToDate Date = '2014-05-02'
;With E1(N) As (Select 1 From (Values (1), (1), (1), (1), (1), (1), (1), (1), (1), (1)) DT(N)), E2(N) As (Select 1 From E1 A Cross Join E1 B), E4(N) As (Select 1 From E2 A Cross Join E2 B), E6(N) As (Select 1 From E4 A Cross Join E2 B), Tally(N) As ( Select Row_Number() Over (Order By (Select Null)) From E6 )Select DateAdd(Day, N - 1, @FromDate) DateFrom TallyWhere N <= DateDiff(Day, @FromDate, @ToDate) + 1Parameters
Section titled “Parameters”|Parameter|Details |---|---|---|--- |@FromDate|The inclusive lower boundary of the generated date range. |@ToDate|The inclusive upper boundary of the generated date range.
Remarks
Section titled “Remarks”Most experts seem to recommend creating a Dates table instead of generating a sequence on the fly. See http://dba.stackexchange.com/questions/86435/filling-in-date-holes-in-grouped-by-date-sql-data