Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Genera un set di risultati di date incrementali in TSQL

Se le tue date non distano più di 2047 giorni l'una dall'altra:

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

Ho aggiornato la mia risposta dopo diverse richieste in tal senso. Perché?

La risposta originale conteneva la sottoquery

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

che fornisce lo stesso risultato, come li ho testati su SQL Server 2008, 2012 e 2016.

Tuttavia, quando ho provato ad analizzare il codice che MSSQL internamente durante l'esecuzione di query da spt_values , ho trovato che il SELECT le istruzioni contengono sempre la clausola WHERE [type]='[magic code]' .

Pertanto ho deciso che sebbene la query restituisca il risultato corretto, fornisce il risultato corretto per motivi sbagliati:

Potrebbe esserci una versione futura di SQL Server che definisce un diverso [type] valore che ha anche NULL come valori per [name] , al di fuori dell'intervallo 0-2047, o addirittura non contiguo, nel qual caso il risultato sarebbe semplicemente sbagliato.