2015-06-30 4 views
23

जब मैं निम्नलिखित क्वेरी निष्पादित कर रहा हूं तो मुझे अलग-अलग परिणाम मिल रहे हैं।डेटीफ फ़ंक्शन अलग-अलग मान क्यों दिखाता है?

SELECT Datediff(year, 0, Getdate()); 

परिणाम था 115

जब मैं इस का उपयोग, मैं एक और परिणाम हो रही है:

SELECT Datediff(year, 1900, Getdate()); 

परिणाम एसक्यूएल सर्वर में 110

असल में था यह 1900-01-01 से ले जाएगा, लेकिन ये अलग-अलग मूल्य क्यों दिखाते हैं?

+3

अगर आप '1900 1900 बदलने आप अपने पहले उदाहरण के रूप में एक ही परिणाम प्राप्त करेंगे - '1 9 00' को आंतरिक रूप से 1 9 00-01-01 –

उत्तर

23

तर्क समझाने के लिए इस प्रयास करें:

select cast(0 as datetime) 
select cast(1 as datetime) 

एक पूर्णांक '1900 एक तिथि प्रारूप की तरह व्याख्या की जाएगी जैसे 1900/01/01 जबकि एक स्ट्रिंग मान के बाद से दिन की संख्या के रूप में व्याख्या की है।

1 9 00 जनवरी 1 9 00 से 1 9 00 दिन 1905-03-16 है, जो 1 9 00 से पांच साल और 110 वर्ष से अब तक (2015) है।

15

ऐसा इसलिए है क्योंकि यदि आप डेटाटाइम के रूप में 0 को कास्ट करते हैं, तो यह साल के हिस्से के रूप में 1 9 00 लौटाता है, जबकि 1 9 00 का सालाना अंश 1 9 05 के रूप में वर्ष के रूप में आता है।

Demo

MSDN से: datetime डेटा प्रकार के साथ

मान दो 4 बाइट पूर्णांक के रूप में Microsoft SQL सर्वर द्वारा आंतरिक रूप से जमा हो जाती है। पहले 4 बाइट बेस तिथि से पहले या उसके बाद 1 जनवरी, 1 9 00 को दिन की संख्या संग्रहित करते हैं। मूल तिथि सिस्टम संदर्भ दिनांक है।

इसका मतलब है, शाब्दिक 0 को datetime 0 दिनों के लिए datetime मूल्य मिल रहा है के बराबर है 1900/01/01 के बाद, जो 1900/01/01 है कास्टिंग। इसी प्रकार 1 9 00 के लिए। इसलिए, जैसा कि @ मार्टिनस्मिथ टिप्पणियों में बताता है, आपकी गणना SELECT Datediff(year,dateadd(d,0,'1/1/1900'), Getdate()) के बराबर है जो 115 की अपेक्षा के अनुसार लौटाती है।

शायद यह ध्यान देने योग्य है कि कास्ट और कन्वर्ट पर एमएसडीएन पृष्ठ विशेष रूप से इस परिदृश्य को कवर नहीं करता है यानी int से datetime पर।

+4

के रूप में डाला जाएगा, जो अनुपस्थित स्पष्टीकरण है कि डेटाटाइम के लिए एक int कास्टिंग प्रभावी ढंग से 'DATEADD (DAY' से' 1900-01-01' –

+0

@ मार्टिनस्मिथ सहमत है। नीचे शिकार करने की कोशिश कर रहा है। एमएसडीएन से अगर कुछ विशिष्ट है 0 मान बोउट। क्या आप कृपया मुझे इंगित कर सकते हैं? –

+0

इसे 'CAST' विषय में उल्लिखित नहीं देखा जा सकता है। द्विआधारी प्रतिनिधित्व के लिए 1 जनवरी 1 9 00 की आधार तिथि का उल्लेख यहां दिया गया है https://technet.microsoft.com/en-us/library/aa258277(v=sql.80).aspx –

3

आपके द्वारा निर्दिष्ट नंबर को दिनों के रूप में जोड़ा जाएगा जिसके परिणामस्वरूप अंतर आएगा।

Select DATEADD(dd,0,0) 
Select DATEADD(dd,1900,0) 

Result1 1900 Result2 1905

तो है का उपयोग कर उन्हें समान हो जाता है:

SELECT Datediff(year,0, Getdate()) = SELECT Datediff(year,DATEADD(dd,0,0), Getdate()); 

SELECT Datediff(year,1900, Getdate()) = SELECT Datediff(year,DATEADD(dd,1900,0), Getdate());; 
संबंधित मुद्दे