Tôi thích sử dụng các tập hợp đã tồn tại, vì điều đó thường hiệu quả hơn nhiều so với các CTE đệ quy đắt tiền. Nếu bạn có một bảng số, hãy sử dụng nó; nếu bạn đã có một bảng lịch, thậm chí còn tốt hơn; nếu không, bạn có thể sử dụng các đối tượng tích hợp sẵn như 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;
Để biết một số thông tin cơ bản, hãy xem:
- http:// www. sqlperformance.com/2013/01/t-sql-queries/generate-a-set-1
- http:// www. sqlperformance.com/2013/01/t-sql-queries/generate-a-set-2
- http:// www. sqlperformance.com/2013/01/t-sql-queries/generate-a-set-3