sql >> Databasteknik >  >> RDS >> Sqlserver

Generera en resultatuppsättning av inkrementerande datum i TSQL

Om det inte är mer än 2047 dagar mellan dina datum:

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

Jag uppdaterade mitt svar efter flera förfrågningar om att göra det. Varför?

Det ursprungliga svaret innehöll underfrågan

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

som ger samma resultat som jag testade dem på SQL Server 2008, 2012 och 2016.

Men när jag försökte analysera koden som MSSQL internt när jag frågade från spt_values , fann jag att SELECT satser innehåller alltid satsen WHERE [type]='[magic code]' .

Därför bestämde jag mig för att även om frågan returnerar det korrekta resultatet, levererar den rätt resultat av felaktiga skäl:

Det kan finnas en framtida version av SQL Server som definierar en annan [type] värde som också har NULL som värden för [name] , utanför intervallet 0-2047, eller till och med icke-sammanhängande, i vilket fall resultatet helt enkelt skulle bli fel.



  1. Hur man hämtar anslutningssträngen från en databas

  2. Hur ASCII() fungerar i MariaDB

  3. Vad betyder nyckelordet KEY?

  4. Vad är skillnaden mellan CHAR och VARCHAR i SQL Server - SQL Server / T-SQL Tutorial Del 31