मेरे पास एक समान समस्या थी:मुझे निम्नलिखित नियमों के आधार पर सप्ताह की संख्या की गणना करने की आवश्यकता थी:
- सप्ताह शुक्रवार से शुरू होता है
- एक वर्ष के शेष दिनों (वर्ष के अंतिम शुक्रवार के बाद के सभी दिन जो एक सप्ताह पूरा नहीं करते हैं) को अगले वर्ष के पहले सप्ताह में गिना जाना चाहिए।
उदाहरण के लिए:
- 27/12/2012 (गुरुवार) 2012 का सप्ताह 52 होना चाहिए
- 28/12/2012 (शुक्रवार) 2013 का पहला सप्ताह होना चाहिए
- सप्ताह 1 2013 28/12/2012 से 3/1/2013 तक चला जाता है
मैंने यह कथन इन नियमों के आधार पर YEAR और WEEKNUMBER दोनों की गणना करने के लिए किया है, जिन्हें आप आसानी से अपनी परिस्थितियों के अनुकूल बना सकते हैं:
SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)),
IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));
मुश्किल हिस्सा सिर्फ यह अभिव्यक्ति है:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
शेष (यदि खंड) केवल वर्ष + 1 और सप्ताह =1 सप्ताह 53 बनाने के लिए अभिव्यक्ति के परिणाम को अनुकूलित करने के लिए हैं।
मैं अभिव्यक्ति को यथासंभव सर्वोत्तम रूप से समझाने की कोशिश करूंगा। निम्नलिखित अभिव्यक्ति आपको सप्ताह संख्या शुद्ध सरल देती है (वर्ष के दिन को एक सप्ताह में 7 दिनों से विभाजित किया जाता है):
ceil(( dayofyear(current_date))/7)
लेकिन अब आप इसे शुक्रवार (या किसी अन्य दिन) से शुरू करना चाहते हैं। ऐसा करने के लिए आपको वर्तमान दिन में जोड़ना होगा, पहले सप्ताह के दिन जो पिछले वर्ष का हिस्सा थे (ऐसा लगता है कि आपका करंट वास्तव में कुछ दिन पहले शुरू हुआ था, क्योंकि आपके पहले सप्ताह में पिछले वर्ष के दिन शामिल हैं)। एक्सप्रेशन जनवरी/1 के कार्यदिवस के आधार पर उस ऑफ़सेट की गणना करता है:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
ऑफ़सेट 7 और कार्यदिवस की संख्या के बीच का अंतर है जिसे आप सप्ताह शुरू करना चाहते हैं:
- 0 शनिवार के लिए
- 1 शुक्रवार के लिए
- 2 गुरुवार के लिए
- 3 बुधवार के लिए...
तो अब आपको इसे पिछले एक में जोड़ना होगा जिसके परिणामस्वरूप उपर्युक्त अभिव्यक्ति होती है जो किसी भी सप्ताह के दिन से शुरू होने वाले सप्ताह की संख्या की गणना करती है और पिछले वर्ष को शुरू करने के लिए सप्ताह 1 मानती है:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
फिर मैंने अभी एक IF जोड़ा है जो सप्ताह 53 को सप्ताह 1 में बदल देता है और दूसरा वर्ष में 1 जोड़ने के लिए यदि यह सप्ताह 53 है।