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

Generer et resultatsæt af stigende datoer i TSQL

Hvis dine datoer ikke er mere end 2047 dage fra hinanden:

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

Jeg opdaterede mit svar efter adskillige anmodninger om at gøre det. Hvorfor?

Det originale svar indeholdt underforespørgslen

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

som giver det samme resultat, som jeg testede dem på SQL Server 2008, 2012 og 2016.

Men da jeg prøvede at analysere koden, der MSSQL internt, når jeg forespørger fra spt_values , fandt jeg ud af, at SELECT sætninger indeholder altid klausulen WHERE [type]='[magic code]' .

Derfor besluttede jeg, at selvom forespørgslen returnerer det korrekte resultat, leverer den det korrekte resultat af forkerte årsager:

Der kan være en fremtidig version af SQL Server, som definerer en anden [type] værdi, som også har NULL som værdier for [name] , uden for intervallet 0-2047, eller endda ikke-sammenhængende, i hvilket tilfælde resultatet simpelthen ville være forkert.



  1. Hvordan HOUR() virker i MariaDB

  2. Reversering af en streng i SQL og PL/SQL Et eksempel

  3. Når det haster

  4. Sådan vælger du et bestemt antal tegn fra venstre eller højre for en streng i SQL Server