Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wygeneruj zestaw wyników inkrementacji dat w TSQL

Jeśli między datami a datami nie przekracza 2047 dni:

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

Zaktualizowałem swoją odpowiedź po kilku prośbach o to. Dlaczego?

Oryginalna odpowiedź zawierała podzapytanie

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

co daje ten sam wynik, co testowałem na SQL Server 2008, 2012 i 2016.

Jednak, gdy próbowałem przeanalizować kod MSSQL wewnętrznie podczas wykonywania zapytań z spt_values , odkryłem, że SELECT instrukcje zawsze zawierają klauzulę WHERE [type]='[magic code]' .

Dlatego zdecydowałem, że chociaż zapytanie zwraca poprawny wynik, dostarcza poprawny wynik z niewłaściwych powodów:

Może istnieć przyszła wersja SQL Server, która definiuje inny [type] wartość, która również ma NULL jako wartości dla [name] , poza zakresem 0-2047, a nawet nieciągły, w takim przypadku wynik byłby po prostu błędny.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trzy łatwe wygrane w zakresie wydajności serwera SQL

  2. Błędy:Instrukcja INSERT EXEC nie może być zagnieżdżona. i Nie można użyć instrukcji ROLLBACK w instrukcji INSERT-EXEC. Jak to rozwiązać?

  3. Przeprowadź analizę produktu za pomocą wyszukiwania pełnotekstowego programu SQL Server. Część 1

  4. Zwróć nazwę lokalnego serwera w SQL Server z @@NAZWASERWERA

  5. Jak wykorzystać zmienną do nazwy bazy danych w T-SQL?