यदि आपको कभी SQL सर्वर में दो तिथियों के बीच अंतर खोजने की आवश्यकता होती है, तो हो सकता है कि आपने DATEDIFF()
का उपयोग किया हो समारोह। यह फ़ंक्शन डेटपार्ट . का उपयोग करके दो तिथियों के बीच समय की मात्रा लौटाता है आपके द्वारा निर्दिष्ट। उदाहरण के लिए, आप इसका उपयोग दिनांक 1 और दिनांक 2 के बीच दिनों की संख्या वापस करने के लिए कर सकते हैं। आप इसे मिनटों, सेकंड, महीनों, वर्षों आदि की संख्या वापस करने के लिए भी प्राप्त कर सकते हैं।
DATEDIFF_BIG()
फ़ंक्शन ठीक उसी तरह काम करता है, लेकिन एक सूक्ष्म अंतर के साथ:इसका रिटर्न डेटा प्रकार।
तो इन दो कार्यों के बीच का अंतर उनके वापसी मूल्य का डेटा प्रकार है।
DATEDIFF()
एक हस्ताक्षरित पूर्णांक देता है (int )DATEDIFF_BIG()
एक हस्ताक्षरित बड़ा पूर्णांक देता है (बिगिंट )
कुछ मामलों में आपको बिगिंट . वापस करने की अधिक आवश्यकता नहीं होगी डेटा प्रकार। यह एक बहुत बड़ी संख्या का प्रतिनिधित्व करता है, और क्या आप DATEDIFF()
. का उपयोग करते हैं? या DATEDIFF_BIG()
कोई फर्क नहीं पड़ेगा (भंडारण आवश्यकताओं को छोड़कर - int 4 बाइट्स का उपयोग करता है, बिगिंट 8 बाइट्स का उपयोग करता है)।
हालाँकि, यदि आप निम्न त्रुटि का सामना करते हैं:
<ब्लॉकक्वॉट>dateiff फ़ंक्शन के परिणामस्वरूप अतिप्रवाह हुआ। दो दिनांक/समय इंस्टेंस को अलग करने वाले डेटपार्ट्स की संख्या बहुत बड़ी है। कम सटीक डेटपार्ट के साथ dateiff का उपयोग करने का प्रयास करें।
ऐसा इसलिए है क्योंकि वापसी मूल्य बहुत बड़ा है।
इस मामले में आपको तीन में से एक काम करना होगा:
- कम समयावधि का उपयोग करें। उदाहरण के लिए, 26 दिनों में मिलीसेकंड की संख्या वापस करने की कोशिश करने के बजाय, 25 प्रयास करें।
- कम सटीक डेटपार्ट का उपयोग करें . उदाहरण के लिए, मिलीसेकंड की संख्या वापस करने की कोशिश करने के बजाय, इसे कुछ सेकंड के साथ आज़माएं।
DATEDIFF_BIG()
का उपयोग करें इसके बजाय कार्य करें।
कभी-कभी पहले दो विकल्प उपयुक्त नहीं होते हैं। यदि आपको 26 दिनों की समयावधि चाहिए, तो 25 में कटौती नहीं होगी। और यदि आपको 2038 के बाद के यूनिक्स टाइमस्टैम्प की आवश्यकता है, तो यदि आप DATEDIFF()
का उपयोग करते हैं, तो आपको 2038 समस्याओं का सामना करना पड़ेगा ।
किसी भी स्थिति में, DATEDIFF_BIG()
फ़ंक्शन DATEDIFF()
. की तुलना में परिणामों की एक बहुत बड़ी श्रेणी की अनुमति देता है ।
उदाहरण
यहां दो उदाहरण दिए गए हैं जो दोनों समानताएं और DATEDIFF()
. के बीच के अंतर को प्रदर्शित करते हैं और DATEDIFF_BIG()
।
समान परिणाम
यहां एक उदाहरण दिया गया है जहां दोनों फ़ंक्शन समान परिणाम देते हैं:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
परिणाम:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
जैसा कि अपेक्षित था, दोनों कार्य एक ही परिणाम लौटाते हैं। ऐसा इसलिए है क्योंकि वापसी मूल्य इतना छोटा है कि बड़ा . दोनों की पूर्ति कर सकता है और इंट डेटा के प्रकार। हमने केवल 1 सेकंड में मिलीसेकंड की संख्या लौटा दी थी।
अलग परिणाम
अब, अगर हम समय सीमा को बढ़ाकर 1000 साल कर दें तो क्या होगा।
सबसे पहले, यहां बताया गया है कि जब हम DATEDIFF()
का उपयोग करते हैं तो क्या होता है :
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
परिणाम:
Error: The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
अब, यहां बताया गया है कि कैसे DATEDIFF_BIG()
इसे संभालता है:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
परिणाम:
DATEDIFF_BIG -------------- 31556908800000
एक int . के लिए 1000 वर्षों में मिलीसेकंड की संख्या लौटाना बहुत अधिक था , लेकिन यह बिगिन्ट . के लिए कोई समस्या नहीं है ।