Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

t-sql chọn nhận tất cả các Tháng trong một phạm vi năm

Chúa ơi ... sử dụng "đếm CTE đệ quy" hoặc "rCTE" cũng tệ hơn hoặc tệ hơn sử dụng một vòng lặp. Hãy xem bài viết sau để biết lý do tại sao tôi lại nói như vậy.

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

Đây là một cách để làm điều đó mà không cần bất kỳ RBAR nào kể cả "RBAR ẩn" của một rCTE đếm.

--===== 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. Phương pháp chính xác để xóa hơn 2100 hàng (theo ID) với Dapper

  2. Định danh duy nhất (hướng dẫn) làm khóa chính trong thiết kế cơ sở dữ liệu

  3. TABLOCK so với TABLOCKX

  4. Làm cách nào để sao chép cơ sở dữ liệu SQL Azure vào máy chủ phát triển cục bộ của tôi?

  5. Những lý do không có chỉ mục nhóm trong SQL Server 2005