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

t-sql select pobierz wszystkie miesiące w zakresie lat

O rany... używanie "zliczania rekurencyjnego CTE" lub "rCTE" jest tak samo złe lub gorsze niż użycie pętli. Przeczytaj poniższy artykuł, aby dowiedzieć się, dlaczego to mówię.

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

Oto jeden ze sposobów na zrobienie tego bez żadnego RBAR, w tym „ukrytego RBAR” zliczającego 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Co robi to zapytanie, aby utworzyć listę rozdzielaną przecinkami w programie SQL Server?

  2. Jak zwrócić ciąg w odwrotnej kolejności za pomocą SQL Server – REVERSE()

  3. Utwórz zadanie agenta programu SQL Server w Azure Data Studio

  4. Jak wydrukować VARCHAR(MAX) za pomocą instrukcji Print?

  5. Przycinanie T-SQL   (i inne znaki niealfanumeryczne)