sql >> Database teknologi >  >> RDS >> Sqlserver

t-sql select få alle måneder inden for en række år

Gosh folkens... at bruge en "tæller rekursiv CTE" eller "rCTE" er lige så slemt eller værre end at bruge en loop. Se venligst den følgende artikel for, hvorfor jeg siger det.

http://www.sqlservercentral.com/articles/T-SQL/74118/

Her er en måde at gøre det på uden nogen RBAR inklusive den "skjulte RBAR" af en tællende rCTE.

--===== Declare and preset some obviously named variables
DECLARE @StartDate DATETIME,
        @EndDate   DATETIME
;
 SELECT @StartDate = '2010-01-14', --We'll get the month for both of these 
        @EndDate   = '2020-12-05'  --dates and everything in between
;
WITH
cteDates AS
(--==== Creates a "Tally Table" structure for months to add to start date
     -- calulated by the difference in months between the start and end date.
     -- Then adds those numbers to the start of the month of the start date.
 SELECT TOP (DATEDIFF(mm,@StartDate,@EndDate) + 1)
        MonthDate = DATEADD(mm,DATEDIFF(mm,0,@StartDate) 
                  + (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1),0)
   FROM sys.all_columns ac1
  CROSS JOIN sys.all_columns ac2
)
--===== Slice each "whole month" date into the desired display values.
 SELECT [Year]  = YEAR(MonthDate),
        [Month] = MONTH(MonthDate) 
   FROM cteDates
;


  1. Tilfældig registrering fra en databasetabel (T-SQL)

  2. Dynamiske pivotkolonner i SQL Server

  3. Opdater SQL Server-statistikker ved hjælp af en databasevedligeholdelsesplan

  4. Sådan gemmer du billede i kolonnen SQL Server-databasetabeller