कृपया, कृपया, कृपया एक कैलेंडर तालिका का उपयोग करें। SQL सर्वर राष्ट्रीय छुट्टियों, कंपनी की घटनाओं, प्राकृतिक आपदाओं आदि के बारे में कुछ भी नहीं जानता है। एक कैलेंडर तालिका बनाना काफी आसान है, बहुत कम जगह लेता है, और यदि इसे पर्याप्त रूप से संदर्भित किया जाता है तो यह स्मृति में रहेगा।
यहां एक उदाहरण दिया गया है जो 30 साल की तारीखों (2000 -> 2029) के साथ एक कैलेंडर तालिका बनाता है, लेकिन डिस्क पर केवल 200 केबी की आवश्यकता होती है (136 केबी यदि आप पृष्ठ संपीड़न का उपयोग करते हैं)। यह लगभग गारंटी है कि रनटाइम पर कुछ सीटीई या अन्य सेट को प्रोसेस करने के लिए आवश्यक मेमोरी ग्रांट से कम होगा।
CREATE TABLE dbo.Calendar
(
dt DATE PRIMARY KEY, -- use SMALLDATETIME if < SQL Server 2008
IsWorkDay BIT
);
DECLARE @s DATE, @e DATE;
SELECT @s = '2000-01-01' , @e = '2029-12-31';
INSERT dbo.Calendar(dt, IsWorkDay)
SELECT DATEADD(DAY, n-1, '2000-01-01'), 1
FROM
(
SELECT TOP (DATEDIFF(DAY, @s, @e)+1) ROW_NUMBER()
OVER (ORDER BY s1.[object_id])
FROM sys.all_objects AS s1
CROSS JOIN sys.all_objects AS s2
) AS x(n);
SET DATEFIRST 1;
-- weekends
UPDATE dbo.Calendar SET IsWorkDay = 0
WHERE DATEPART(WEEKDAY, dt) IN (6,7);
-- Christmas
UPDATE dbo.Calendar SET IsWorkDay = 0
WHERE MONTH(dt) = 12
AND DAY(dt) = 25
AND IsWorkDay = 1;
-- continue with other holidays, known company events, etc.
अब आप जिस क्वेरी का अनुसरण कर रहे हैं वह लिखने में काफी आसान है:
SELECT COUNT(*) FROM dbo.Calendar
WHERE dt >= '20130110'
AND dt < '20130115'
AND IsWorkDay = 1;
कैलेंडर तालिकाओं के बारे में अधिक जानकारी:
http://web.archive.org/web/20070611150639/http://sqlserver2000.databases.aspfaq.com/why- should-i-consider-using-an-auxiliary-calendar-table.html
लूप के बिना सेट जनरेट करने के बारे में अधिक जानकारी:
http://www.sqlperformance.com/tag/date-ranges
DATENAME
. के अंग्रेज़ी आउटपुट पर निर्भर रहने जैसी छोटी-छोटी बातों से भी सावधान रहें . मैंने कई एप्लिकेशन को टूटते देखा है क्योंकि कुछ उपयोगकर्ताओं की भाषा सेटिंग भिन्न थी, और यदि आप WEEKDAY
पर भरोसा कर रहे हैं सुनिश्चित करें कि आपने अपना DATEFIRST
सेट किया है उचित रूप से सेटिंग...