Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Générer un jeu de résultats de dates incrémentielles dans TSQL

Si vos dates ne sont pas séparées de plus de 2 047 jours :

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

J'ai mis à jour ma réponse après plusieurs demandes en ce sens. Pourquoi ?

La réponse d'origine contenait la sous-requête

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

qui donne le même résultat, car je les ai testés sur SQL Server 2008, 2012 et 2016.

Cependant, comme j'ai essayé d'analyser le code MSSQL en interne lors de l'interrogation de spt_values , j'ai trouvé que le SELECT les instructions contiennent toujours la clause WHERE [type]='[magic code]' .

Par conséquent, j'ai décidé que bien que la requête renvoie le bon résultat, elle donne le bon résultat pour de mauvaises raisons :

Il peut y avoir une future version de SQL Server qui définit un [type] différent valeur qui a aussi NULL comme valeurs pour [name] , en dehors de la plage de 0 à 2047, voire non contiguës, auquel cas le résultat serait tout simplement faux.