Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Генерирайте набор от резултати от нарастващи дати в TSQL

Ако датите ви са с разлика от не повече от 2047 дни:

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

Актуализирах отговора си след няколко искания да го направя. Защо?

Първоначалният отговор съдържаше подзаявката

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

което дава същия резултат, както ги тествах на SQL Server 2008, 2012 и 2016.

Въпреки това, докато се опитах да анализирам кода, който MSSQL вътрешно при запитване от spt_values , открих, че SELECT изразите винаги съдържат клаузата WHERE [type]='[magic code]' .

Затова реших, че въпреки че заявката връща правилния резултат, тя дава правилния резултат по грешни причини:

Може да има бъдеща версия на SQL Server, която дефинира различен [type] стойност, която също има NULL като стойности за [name] , извън диапазона от 0-2047, или дори несвързани, в който случай резултатът би бил просто грешен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Внедряване на инкрементално натоварване с помощта на заснемане на промяна на данни в SQL Server

  2. Как може хигиенизирането, което избягва единични кавички, да бъде победено от SQL инжекция в SQL Server?

  3. Възможно ли е принудително заключване на ниво ред в SQL Server?

  4. CRUD операции на SQL Server

  5. Как да генерирате изявления за вмъкване от данни на Excel и да заредите в таблица на SQL Server - SQL Server / TSQL урок, част 103