sql >> Databasteknik >  >> RDS >> Sqlserver

bättre sätt att generera månader/år tabell

Jag föredrar att använda uppsättningar som redan finns, eftersom det ofta är mycket effektivare än dyra rekursiva CTE:er. Om du har en taltabell, använd den; om du redan har ett kalenderbord, ännu bättre; annars kan du använda inbyggda objekt som 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;

För lite bakgrund, se:




  1. Producera DISTINCT-värden i STRING_AGG

  2. Hur uttrycker jag en har många genom relation i Entity Framework 5?

  3. ignorera dubbletter av resultat från varje loop som itererar genom mysql-frågan

  4. Användardefinierad rutin med DBMS_STATS, del II