महीने के विशिष्ट दिन को वापस करने का कार्य
यह हमारी रखरखाव योजना के लिए उपयोगी रहा है, क्योंकि हम एक स्क्रिप्ट का उपयोग कर सकते हैं और कोड जोड़ सकते हैं जो एक विशिष्ट दिन (जैसे पिछले रविवार, या पहले सप्ताह के दिन) पर चलेगा, मैंने इसका उपयोग उस समय की भविष्यवाणी के लिए भी किया है जब नौकरियां चल रही होंगी। हमारे सर्वर।
फ़ंक्शन को केवल तीन इनपुट की आवश्यकता होती है, जिस महीने में आप रुचि रखते हैं, प्रकार और संख्या।
यह उसी तरह की जानकारी का उपयोग करता है जैसे Microsoft मासिक कार्य शेड्यूल के लिए करता है।
SQL
CREATE FUNCTION dbo.GetMonthDay(@Month DATETIME,@Type INT, @Counter INT) RETURNS DATETIME AS BEGINSET @Month = CONVERT(DATE,DATEADD(DAY,1-DATEPART(DAY,@Month),@Month))DECLARE @CurDate DATETIME=@Month,@Date DATETIME,@Matches INT=0,@TempDate DATETIMEWHILE @CurDate IF (SELECT (CASE @Type WHEN 1 THEN (CASE WHEN DATEPART(WeekDay,@CurDate)=1 THEN 1 ELSE 0 END)WHEN 2 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=2 THEN 1 ELSE 0 END)WHEN 3 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=3 THEN 1 ELSE 0 END)WHEN 4 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=4 THEN 1 ELSE 0 END)WHEN 5 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=5 THEN 1 ELSE 0 END)WHEN 6 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=6 THEN 1 ELSE 0 END)WHEN 7 THEN(CASE WHEN DATEPART(WeekDay,@CurDate)=7 THEN 1 ELSE 0 END)WHEN 8 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,2,3,4,5,6,7) THEN 1 ELSE 0 END)WHEN 9 THEN(CASE WHEN DATEPART(WeekDay,@CurDate) IN (2,3,4,5,6) THEN 1 ELSE 0 END)WHEN 10 THEN (CASE WHEN DATEPART(WeekDay,@CurDate) IN (1,7) THEN 1 ELSE 0 END)ELSE 0 END))=1 BEGINSET @Matches = @Matches+1SET @TempDate = @CurDateENDIF @Matches=@Counter AND @Counter<32 BEGINSET @Date=@TempDateENDSET @CurDate=DATEADD(DAY,1,@CurDate)ENDRETURN ISNULL(@Date,@TempDate)ENDGO
यह क्या करता है
हमारे पास जो मान हैं वे sysschedules तालिका के समान हैं लेकिन मैं उन्हें यहां सूचीबद्ध करूंगा;
@टाइप
- 1=रविवार
- 2=सोमवार
- 3=मंगलवार
- 4=बुधवार
- 5=गुरुवार
- 6=शुक्रवार
- 7=शनिवार
- 8=किसी भी दिन काउंटर तक या महीने के अंतिम दिन
- 9=कोई भी कार्यदिवस काउंटर तक या महीने के अंतिम दिन तक
- 10=किसी भी शनिवार या रविवार को काउंटर या महीने की आखिरी घटना तक
@विरोध करना
- 1=1प्रथम
- 2=दूसरा
- 3=3
- 4=4थ
- 32=अंतिम (ये थोड़े अलग हैं)
इसके निम्नलिखित चरण हैं;
- इनपुट तिथि को महीने के पहले दिन पर सेट करें
- महीने के दौरान हमारे लूप के लिए चर घोषित करें
- प्रत्येक तिथि के माध्यम से लूप करें और यदि कोई मैच है तो मैच की संख्या अपडेट करें, और अंतिम मैच आयोजित करने के लिए एक अस्थायी तिथि अपडेट करें
- यदि मैच हमारे काउंटर के बराबर हैं, और काउंटर 5 (5 = अंतिम दिन) से कम है, तो हमारी वापसी तिथि को अस्थायी तिथि के रूप में सेट करें, यह तब लूप से बाहर निकल जाएगा क्योंकि तिथि अब शून्य नहीं है।
- हमारी वर्तमान तिथि में एक जोड़ें और फिर से हमारी जांच करें।
- हमारी तिथि लौटाएं, या यदि अस्थायी तारीख को शून्य कर दें जो कि हमारा अंतिम मैच था।
नीचे उपयोग में इसका एक उदाहरण है। यह फरवरी माह के प्रत्येक रविवार को चलेगा।
संग्रहीत प्रक्रिया के कुछ हिस्सों को चलाने के लिए या नहीं, यह निर्धारित करने के लिए आप इसे आईएफ क्लॉज में उपयोग कर सकते हैं।
Testing
SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,1) --2020-02-02 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,2) --2020-02-09 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,3) --2020-02-16 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,4) --2020-02-23 00:00:00.000SELECT Utilities.dbo.GetMonthDay('2020-02-11',1,32)--2020-02-23 00:00:00.000IF Utilities.dbo.GetMonthDay('2020-02-11',1,32)='2020-02-23' BEGINSELECT 'Run your code'END
अग्रिम पठन
मुझे आशा है कि यह आपके लिए उपयोगी हो सकता है, या यह आपको अन्य प्रक्रियाओं के लिए एक विचार देता है।
यदि आपको छुट्टियों के साथ गणना करने की आवश्यकता है तो आपको एक कैलेंडर तालिका की आवश्यकता होगी, और आप नीचे दिए गए लिंक पर एक महान उदाहरण देख सकते हैं।