आईएसओ वीक बनाम SQL सर्वर वीक


33

ठीक है तो मेरे पास एक रिपोर्ट है जो इस सप्ताह बनाम पिछले सप्ताह की तुलना करती है और हमारे ग्राहक ने देखा कि उनका डेटा "कायरतापूर्ण" था। आगे की जांच में हमने पाया कि यह आईएसओ मानकों के अनुसार सही ढंग से सप्ताह नहीं कर रहा था। मैंने इस स्क्रिप्ट को टेस्ट केस के रूप में चलाया।

SET DATEFIRST 1
SELECT DATEPART(WEEK, '3/26/13')
    , DATEPART(WEEK, '3/27/12')
    , DATEPART(WEEK, '3/20/12')
    , DATEPART(WEEK, '1/2/12')
SELECT DATEPART(ISO_WEEK, '3/26/13')
    , DATEPART(ISO_WEEK, '3/27/12')
    , DATEPART(ISO_WEEK, '3/20/12')
    , DATEPART(ISO_WEEK, '1/2/12')

जब मैं चला तो मुझे ये परिणाम मिले।

परिणाम सेट

मैंने सोचा कि यह अजीब था और इसलिए मैंने कुछ और खुदाई की और पाया कि एसक्यूएल सर्वर 1 जनवरी को वर्ष के पहले सप्ताह के रूप में गिना जाता है जहां आईएसओ जनवरी में पहले रविवार को वर्ष के पहले सप्ताह के रूप में गिना जाता है।

सवाल तो दो गुना होने से खत्म हो जाता है। प्रश्न 1 यह क्यों है? प्रश्न 2 क्या इसे बदलने का कोई तरीका है इसलिए मुझे अपने सभी कोड को ISO_Weekहर जगह उपयोग करने के लिए संशोधित नहीं करना है?

जवाबों:


27

जब SQL सर्वर ने पहली बार WEEKतारीख / भाग को लागू किया था, तो उन्हें चुनाव करना था। मुझे नहीं लगता कि इसके बारे में वास्तव में बहुत अधिक चेतना थी, उस समय के सबसे सामान्य मानक को संरेखित करने के अलावा - याद रखें कि यह उस समय था जब मानकों के अनुरूप होना सर्वोच्च प्राथमिकता नहीं थी (अन्यथा हमारे पास ऐसी चीजें नहीं होंगी timestamp, IDENTITYऔर TOP)। बाद में उन्होंने जोड़ाISO_WEEK (2008 मुझे विश्वास है) क्योंकि इस बीच का हल यह था कि आप अपना, धीमा, भद्दा स्केलर UDF लिखें - वास्तव में उन्होंने भी एक बहुत बुरा बना दिया और इसे आधिकारिक दस्तावेज में डाल दिया (इसे तब से हटा दिया गया है जैसा कि मैं बता सकता हूं)।

मुझे DATEPART(WEEKयह ढोंग करने का कोई तरीका नहीं पता है DATEPART(ISO_WEEK- मुझे लगता है कि आपको कोड बदलना होगा (और यदि आप स्रोत नियंत्रण का उपयोग कर रहे हैं, तो यह बहुत कठिन नहीं होना चाहिए - आप यह गणना कितने स्थानों पर कर रहे हैं?) आपने इसे कहीं और कंप्यूटिंग करने के बारे में सोचा था, इसलिए आपके कोड को इसके साथ जोड़ा नहीं जाना चाहिए; क्योंकि आप अब कोड बदल रहे हैं, इस पर विचार करने का समय हो सकता है ...)।

और अगर तुम सच में जवाब क्यों चाहते हो? मुझे लगता है कि आपको यह निर्धारित करने के लिए कुछ मूल डेवलपर्स को हथियाना होगा कि उन्होंने डिफ़ॉल्ट को क्यों चुना जो उन्होंने किया। फिर से, मुझे लगता है कि यह एक वास्तविक "एफ मानक नहीं था!" पसंद, बल्कि, "क्या मानकों?"

यहाँ कुछ जानकारी है जो उपयोगी हो सकती है:

https://stackoverflow.com/questions/348880/getting-week-number-off-a-date-in-ms-sql-server-2005

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/iso-week-in-sql-server


तकनीकी रूप से मुझे बस इतना करना चाहिए कि मेरी डिमल्केन्डर टेबल को बदल दें दुर्भाग्य से हमारे डेवलपर्स ने इसे कई रिपोर्ट इंस्टेंस में उपयोग नहीं करने का फैसला किया है, इसलिए इसकी गणना मक्खी पर की जा रही है। बड़े पैमाने पर यह किसी भी तरह के संकट की तुलना में जिज्ञासा में अधिक अभ्यास था।
ज़ैन

5
मेरा सुझाव है कि आप अपने डेवलपर्स को काउबॉय कोडिंग के बजाय सर्वोत्तम प्रथाओं का पालन करने के लिए अपनी रिपोर्ट अपडेट करें। लेकिन वह सिर्फ मैं हूं।
हारून बर्ट्रेंड

1
अच्छी खबर एक हफ्ते से भी कम समय में है जब वे अब मेरे डेवलपर्स नहीं होंगे। :)
ज़ैन

2

वर्ष के पहले सप्ताह के लिए अलग-अलग स्थितियां मानने वाले कई अधिकारी हैं। सप्ताह का पहला दिन कुछ पहले सप्ताह से शुरू होता है लेकिन सबसे सामान्य विचार यह है कि पहला सप्ताह जो पहले गुरुवार को होता है वह वर्ष का पहला सप्ताह होता है।

तो ISO_WEEKस्वीकार करता है कि और 2010, 2011 या 2012 में आप जाँच कर सकते हैं के रूप में की तरह है कि ISO_WEEK1st जनवरी 52 वें या 53 वें सप्ताह कहते हैं, जबकि है WEEKया WKया WWकहते हैं कि वे पहले सप्ताह कर रहे हैं।

SELECT DATEPART (WW,'01/01/2010')   --> 1
SELECT DATEPART (WK,'01/01/2010')   --> 1
SELECT DATEPART (WEEK,'01/01/2010')   --> 1
SELECT DATEPART (ISO_WEEK,'01/01/2010')   --> 53
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.