Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Generieren Sie eine Ergebnismenge mit inkrementierenden Datumsangaben in TSQL

Wenn Ihre Daten nicht mehr als 2047 Tage auseinander liegen:

declare @dt datetime, @dtEnd datetime
set @dt = getdate()
set @dtEnd = dateadd(day, 100, @dt)

select dateadd(day, number, @dt)
from 
    (select number from master.dbo.spt_values
     where [type] = 'P'
    ) n
where dateadd(day, number, @dt) < @dtEnd

Ich habe meine Antwort nach mehreren Anfragen aktualisiert. Warum?

Die ursprüngliche Antwort enthielt die Unterabfrage

 select distinct number from master.dbo.spt_values
     where name is null

was das gleiche Ergebnis liefert, da ich sie auf SQL Server 2008, 2012 und 2016 getestet habe.

Da ich jedoch versucht habe, den Code zu analysieren, der MSSQL intern beim Abfragen von spt_values verwendet , ich habe festgestellt, dass die SELECT -Anweisungen enthalten immer die Klausel WHERE [type]='[magic code]' .

Daher habe ich entschieden, dass die Abfrage zwar das richtige Ergebnis zurückgibt, aber aus falschen Gründen das richtige Ergebnis liefert:

Möglicherweise gibt es eine zukünftige Version von SQL Server, die einen anderen [type] definiert Wert, der auch NULL hat als Werte für [name] , außerhalb des Bereichs von 0-2047 oder sogar nicht zusammenhängend, in diesem Fall wäre das Ergebnis einfach falsch.