Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

टी-एसक्यूएल को 2 तिथियों के बीच कार्य दिवसों की संख्या मिलती है

कृपया, कृपया, कृपया एक कैलेंडर तालिका का उपयोग करें। 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 सेट किया है उचित रूप से सेटिंग...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल-सर्वर के लिए एक चर में गतिशील एसक्यूएल का परिणाम प्राप्त करना

  2. उपलब्धता समूहों पर हमेशा SQL सर्वर की निगरानी करने के विभिन्न तरीके

  3. SQL सर्वर प्रबंधन स्टूडियो का उपयोग करने के तरीके के बारे में जानें

  4. एक्सएमएल के लिए एसक्यूएल के साथ एचटीएमएल टेबल बनाएं

  5. जहां क्लॉज में कोई खिड़की वाला कार्य क्यों नहीं है?