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

lepszy sposób na generowanie tabeli miesięcy/rok

Wolę używać zestawów, które już istnieją, ponieważ jest to często znacznie wydajniejsze niż drogie rekurencyjne CTE. Jeśli masz tabelę liczb, użyj jej; jeśli masz już tabelę kalendarza, jeszcze lepiej; w przeciwnym razie możesz użyć wbudowanych obiektów, takich jak master.dbo.spt_values :

DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2012-01-01';
SET @ToDate = '2012-12-31';

-- all days in that period
SELECT TOP (DATEDIFF(DAY, @FromDate, @ToDate)+1) 
  TheDate = DATEADD(DAY, number, @FromDate)
  FROM [master].dbo.spt_values 
  WHERE [type] = N'P' ORDER BY number;

-- just the months in that period
SELECT TOP (DATEDIFF(MONTH, @FromDate, @ToDate)+1) 
  TheDate  = DATEADD(MONTH, number, @FromDate),
  TheMonth = MONTH(DATEADD(MONTH, number, @FromDate)),
  TheYear  = YEAR(DATEADD(MONTH, number, @FromDate))
  FROM [master].dbo.spt_values 
  WHERE [type] = N'P' ORDER BY number;

Aby zapoznać się z pewnym kontekstem, zobacz:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nowe zmiany w kolumnach zawierających tylko metadane w SQL Server 2016

  2. Niebezpieczeństwo używania „IF EXISTS... UPDATE .. ELSE .. INSERT” i jaka jest alternatywa?

  3. Jak usunąć klucz obcy w SQL Server?

  4. Używanie PATINDEX do znajdowania wzorców o różnej długości w T-SQL

  5. Błąd konwersji danych zbiorczego ładowania (niezgodność typu lub nieprawidłowy znak dla określonej strony kodowej) dla wiersza 1, kolumny 4 (rok)