यह अभिव्यक्ति -
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400012345001234550', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)
प्रारंभ दिनांक @S और समाप्ति दिनांक @E के बीच व्यावसायिक दिनों की संख्या की गणना करता है।
माना जाता है कि समाप्ति तिथि (@E) प्रारंभ तिथि (@S) से पहले नहीं है। DATEDIFF के साथ संगत है कि वही प्रारंभ तिथि और समाप्ति तिथि शून्य व्यावसायिक दिन देती है। छुट्टियों को अनदेखा करता है।
अंकों की स्ट्रिंग निम्नानुसार बनाई गई है। प्रारंभ दिनों और समाप्ति दिनों की एक तालिका बनाएं, पंक्तियों को सोमवार (सप्ताह के 0) से शुरू होना चाहिए और कॉलम सोमवार से भी शुरू होना चाहिए। सभी 0 (यानी सोमवार और सोमवार, मंगलवार और मंगलवार, आदि के बीच 0 कार्य दिवस हैं) के साथ शीर्ष बाएं से नीचे दाईं ओर विकर्ण भरें। प्रत्येक दिन के लिए विकर्ण से शुरू करें (हमेशा 0 होना चाहिए) और कॉलम में भरें ठीक है, एक समय में एक दिन। यदि आप सप्ताहांत के दिन (गैर-व्यावसायिक दिन) कॉलम पर उतरते हैं, तो व्यावसायिक दिनों की संख्या नहीं बदलती है, इसे बाईं ओर से ले जाया जाता है। अन्यथा, व्यावसायिक दिनों की संख्या एक से बढ़ जाती है। जब आप पंक्ति लूप के अंत तक वापस उसी पंक्ति की शुरुआत में पहुँचते हैं और तब तक जारी रखते हैं जब तक आप फिर से विकर्ण तक नहीं पहुँच जाते। फिर अगली पंक्ति पर जाएँ।
उदा. मान लें कि शनिवार और रविवार व्यावसायिक दिन नहीं हैं -
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 1 2 3 4 5 0 0
S| 1 2 3 4 5 5 0
फिर तालिका में 49 मानों को स्ट्रिंग में संयोजित करें।
अगर आपको कोई बग मिले तो कृपया मुझे बताएं।
-संपादित बेहतर तालिका:
| M T W T F S S
-|--------------
M| 0 1 2 3 4 4 4
T| 4 0 1 2 3 3 3
W| 3 4 0 1 2 2 2
T| 2 3 4 0 1 1 1
F| 1 2 3 4 0 0 0
S| 0 1 2 3 4 0 0
S| 0 1 2 3 4 4 0
बेहतर स्ट्रिंग:'012344440123333401222234011112340001234000123440'
बेहतर अभिव्यक्ति:
5 * (DATEDIFF(@E, @S) DIV 7) + MID('0123444401233334012222340111123400001234000123440', 7 * WEEKDAY(@S) + WEEKDAY(@E) + 1, 1)