sql >> Database >  >> RDS >> Sqlserver

Genereer een resultatenset van oplopende datums in TSQL

Als uw datums niet meer dan 2047 dagen uit elkaar liggen:

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

Ik heb mijn antwoord bijgewerkt na verschillende verzoeken om dit te doen. Waarom?

Het oorspronkelijke antwoord bevatte de subquery

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

wat hetzelfde resultaat oplevert, zoals ik ze heb getest op SQL Server 2008, 2012 en 2016.

Toen ik echter probeerde de code van MSSQL intern te analyseren bij het opvragen van spt_values , ontdekte ik dat de SELECT statements bevatten altijd de clausule WHERE [type]='[magic code]' .

Daarom heb ik besloten dat hoewel de query het juiste resultaat retourneert, het om verkeerde redenen het juiste resultaat oplevert:

Er kan een toekomstige versie van SQL Server zijn die een andere [type] definieert waarde die ook NULL . heeft als waarden voor [name] , buiten het bereik van 0-2047, of zelfs niet-aaneengesloten, in welk geval het resultaat gewoon verkeerd zou zijn.



  1. EXECUTE FORMAT gebruiken ... GEBRUIKEN in de postgres-functie

  2. Bevat MS SQL Server tussen de bereikgrenzen?

  3. SQL-serverquery om de lijst met kolommen in een tabel te krijgen, samen met gegevenstypen, NOT NULL en PRIMARY KEY-beperkingen

  4. Vind de hostnaam en poort met behulp van PSQL-commando's