sql >> Databáze >  >> RDS >> Sqlserver

Vygenerujte sadu výsledků s narůstajícími daty v TSQL

Pokud mezi vašimi daty není více než 2047 dní:

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

Po několika žádostech jsem aktualizoval svou odpověď. Proč?

Původní odpověď obsahovala dílčí dotaz

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

což přináší stejný výsledek, jak jsem je testoval na SQL Server 2008, 2012 a 2016.

Nicméně, jak jsem se snažil analyzovat kód, který MSSQL interně při dotazování z spt_values , zjistil jsem, že SELECT příkazy vždy obsahují klauzuli WHERE [type]='[magic code]' .

Proto jsem se rozhodl, že ačkoli dotaz vrací správný výsledek, poskytuje správný výsledek ze špatných důvodů:

Může existovat budoucí verze SQL Server, která definuje jiný [type] hodnota, která má také NULL jako hodnoty pro [name] , mimo rozsah 0-2047, nebo dokonce nesouvislé, v takovém případě by byl výsledek jednoduše špatný.



  1. Jak klíčová slova IMMUTABLE, STABLE a VOLATILE ovlivňují chování funkce?

  2. Jak zkombinovat výsledky dvou dotazů v SQL

  3. Dokumentace Oracle

  4. Dopad události query_post_execution_showplan Extended v SQL Server 2012