sql >> Database >  >> RDS >> Sqlserver

betere manier om maanden/jaartabel te genereren

Ik gebruik liever sets die al bestaan, omdat dat vaak veel efficiënter is dan dure recursieve CTE's. Als je een getallentabel hebt, gebruik die dan; als je al een kalendertafel hebt, nog beter; anders kunt u ingebouwde objecten gebruiken zoals 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;

Zie voor achtergrondinformatie:




  1. MYSQL-bestelling vanaf een andere tafel

  2. Kolominfo ophalen voor een tabel of weergave in SQL Server (T-SQL:sp_columns)

  3. orakel hoe mijn tafel te draaien

  4. Subquery retourneert meer dan 1 rij-oplossing voor updatequery met select-instructie