मैं पहले से मौजूद सेटों का उपयोग करना पसंद करता हूं, क्योंकि यह महंगे रिकर्सिव सीटीई की तुलना में अक्सर अधिक कुशल होता है। यदि आपके पास संख्या तालिका है, तो इसका उपयोग करें; यदि आपके पास पहले से कैलेंडर तालिका है, तो और भी बेहतर; अन्यथा, आप बिल्ट इन ऑब्जेक्ट्स जैसे 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;
कुछ पृष्ठभूमि के लिए, देखें:
- 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