Sök…


parametrar

Parameter detaljer
@Från datum Den inkluderande nedre gränsen för det genererade datumintervallet.
@ToDate Den inkluderande övre gränsen för det genererade datumintervallet.

Anmärkningar

De flesta experter verkar rekommendera att du skapar en datatabell istället för att generera en sekvens under resan. Se http://dba.stackexchange.com/questions/86435/filling-in-date-holes-in-grouped-by-date-sql-data

Generera datumintervall med rekursiv CTE

Med hjälp av en rekursiv CTE kan du generera ett inkluderande datumintervall:

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  Date
From    DateCte
Option  (MaxRecursion 0)

Standardinställningen MaxRecursion är 100. Att generera mer än 100 datum med den här metoden kräver segmentet Option (MaxRecursion N) i frågan, där N är önskad inställning för MaxRecursion . Om du ställer in detta till 0 tas MaxRecursion begränsningen helt bort.

Generera ett datumintervall med en sammanställningstabell

Ett annat sätt du kan generera ett datumintervall är genom att använda en tallytabell för att skapa datum mellan intervallet:

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) Date
From     Tally
Where    N <= DateDiff(Day, @FromDate, @ToDate) + 1


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow