यह लेख डेटाटाइम . के बीच मुख्य अंतरों पर प्रकाश डालता है और डेटाटाइमऑफ़सेट SQL सर्वर में डेटा प्रकार।
दोनों डेटा प्रकारों का उपयोग दिनांक और समय मानों को संग्रहीत करने के लिए किया जाता है। लेकिन दोनों के बीच महत्वपूर्ण अंतर हैं।
शायद सबसे स्पष्ट अंतर यह है कि डेटाटाइमऑफ़सेट समय क्षेत्र ऑफ़सेट स्टोर करता है, जबकि डेटाटाइम नहीं करता है।
एक और महत्वपूर्ण अंतर यह है कि डेटाटाइमऑफ़सेट आपको सटीकता निर्दिष्ट करने की अनुमति देता है (7 दशमलव स्थानों तक)। इसका मतलब है कि डेटाटाइमऑफ़सेट उपयोग की जा रही सटीकता के आधार पर, मान उनके भंडारण आकार में भिन्न हो सकते हैं।
डेटाटाइम दूसरी ओर टाइप करें, एक निश्चित भंडारण आकार और सटीकता है।
आम तौर पर, आपको डेटाटाइम . का उपयोग करने से बचना चाहिए जब तक कि आपके पास इसका उपयोग करने का कोई अच्छा कारण न हो (जैसे कि किसी विरासती प्रणाली का समर्थन करना)। साथ ही, डेटाटाइम2 प्रकार डेटाटाइमऑफ़सेट . की तुलना में अधिक निकट मिलान है , इसलिए यदि आपको समय क्षेत्र ऑफ़सेट की आवश्यकता नहीं है तो आप इसका उपयोग करना बेहतर समझते हैं।
किसी भी तरह से, यहां एक तालिका है जो डेटाटाइम . की तुलना करती है और डेटाटाइमऑफ़सेट :
सुविधा | <वें शैली ="चौड़ाई:40%;">डेटाटाइमऑफ़सेट <वें शैली="चौड़ाई:40%;">दिनांक समय||
---|---|---|
एसक्यूएल कम्प्लायंट (एएनएसआई और आईएसओ 8601) | हां | नहीं |
तारीख सीमा | 0001-01-01 से 9999-12-31 तक | 1753-01-01 से 9999-12-31 तक |
समय सीमा | 00:00:00 से 23:59:59.99999999 | 00:00:00 से 23:59:59.97 |
चरित्र की लंबाई | 26 स्थान न्यूनतम 34 अधिकतम | न्यूनतम 19 स्थान अधिकतम 23 |
भंडारण आकार | 8 से 10 बाइट्स, सटीकता पर निर्भर करता है* * प्लस 1 बाइट कुछ मामलों में सटीकता को स्टोर करने के लिए। अधिक जानकारी के लिए नीचे देखें। | 8 बाइट्स |
सटीकता | 100 नैनोसेकंड | .000, .003, या .007 सेकंड की वृद्धि के लिए पूर्णांकित |
उपयोगकर्ता द्वारा परिभाषित भिन्नात्मक दूसरी परिशुद्धता | हां | नहीं |
समय क्षेत्र ऑफ़सेट रेंज | -14:00 से +14:00 | कोई नहीं |
समय क्षेत्र ऑफसेट जागरूक और संरक्षण | हां | नहीं |
डेलाइट सेविंग अवेयर | नहीं | नहीं |
उदाहरण 1 - मूल तुलना
किसी भी मामले में, डेटाटाइम . के बीच बुनियादी अंतर को प्रदर्शित करने के लिए यहां एक त्वरित उदाहरण दिया गया है और डेटाटाइमऑफ़सेट ।
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = @thedatetimeoffset; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
परिणाम:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.5555555 +07:30 | 2025-05-21 10:15:30.557 | +------------------------------------+-------------------------+
यहां, मैंने एक डेटाटाइम . सेट किया है डेटाटाइमऑफ़सेट . के समान मान के लिए परिवर्तनीय चर। इससे मान डेटाटाइम . में रूपांतरित हो जाता है और फिर हम एक SELECT
. का उपयोग कर सकते हैं प्रत्येक चर के मूल्य को देखने के लिए कथन।
इस मामले में, डेटाटाइमऑफ़सेट मान में समय क्षेत्र ऑफ़सेट और 7 दशमलव स्थान शामिल हैं। डेटाटाइम दूसरी ओर, मान में समय क्षेत्र ऑफ़सेट शामिल नहीं है और इसमें केवल 3 दशमलव स्थान हैं। इसके अलावा, इसका तीसरा भिन्नात्मक अंक गोल किया गया है। ऐसा इसलिए है क्योंकि इसकी सटीकता हमेशा .000, .003, या .007 सेकंड की वृद्धि के लिए गोल होती है।
उदाहरण 2 - स्ट्रिंग लिटरल्स से मान सेट करना
पिछले उदाहरण में, डेटाटाइम मान को डेटाटाइमऑफ़सेट . के समान मान पर सेट करके असाइन किया गया था मूल्य। जब हम ऐसा करते हैं, तो SQL सर्वर डेटा को नए डेटा प्रकार को "फिट" करने के लिए एक अंतर्निहित रूपांतरण करता है।
यदि हम वही मान सीधे डेटाटाइम . को निर्दिष्ट करने का प्रयास करते हैं चर हमें एक त्रुटि मिलती है:
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = '2025-05-21 10:15:30.5555555 +07:30'; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
परिणाम:
Msg 241, Level 16, State 1, Line 5 Conversion failed when converting date and/or time from character string.
ऐसा इसलिए है क्योंकि डेटाटाइम डेटा प्रकार समय क्षेत्र ऑफ़सेट के साथ स्ट्रिंग अक्षर का समर्थन नहीं करता है। साथ ही, यह 3 से अधिक दशमलव स्थानों के साथ स्ट्रिंग अक्षर का समर्थन नहीं करता है।
इसलिए यदि हम समय क्षेत्र ऑफ़सेट हटाते हैं, लेकिन सभी भिन्नात्मक सेकंड रखते हैं, तब भी हमें एक त्रुटि मिलेगी:
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = '2025-05-21 10:15:30.5555555'; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
परिणाम:
Msg 241, Level 16, State 1, Line 5 Conversion failed when converting date and/or time from character string.
इसे काम करने के लिए, हमें 3 से अधिक दशमलव स्थानों के साथ एक मान निर्दिष्ट करने की आवश्यकता होगी:
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
परिणाम:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.5555555 +07:30 | 2025-05-21 10:15:30.557 | +------------------------------------+-------------------------+
किसी भी तरह, डेटाटाइम डेटाटाइमऑफ़सेट . के लिए हमेशा एक अलग मान रखेगा , क्योंकि इसमें टाइमज़ोन ऑफ़सेट शामिल नहीं है। यह सच होगा भले ही हम एक ही भिन्नात्मक सेकंड सटीक और भिन्नात्मक सेकंड मान का उपयोग करें।
इसे प्रदर्शित करने के लिए, यदि हम डेटाटाइमऑफ़सेट . को समान मान निर्दिष्ट करते हैं तो यहां क्या होता है :
DECLARE @thedatetimeoffset datetimeoffset(3), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.123'; SET @thedatetime = '2025-05-21 10:15:30.123'; SELECT @thedatetimeoffset AS 'datetimeoffset', @thedatetime AS 'datetime';
परिणाम:
+------------------------------------+-------------------------+ | datetimeoffset | datetime | |------------------------------------+-------------------------| | 2025-05-21 10:15:30.1230000 +00:00 | 2025-05-21 10:15:30.123 | +------------------------------------+-------------------------+
इस मामले में डेटाटाइमऑफ़सेट 3 के पैमाने का उपयोग करता है, जो इसे 3 दशमलव स्थान देता है (डेटाटाइम . के समान) ) यह डेटाटाइमऑफ़सेट(3) . का उपयोग करके किया जाता है चर घोषित करते समय।
मैंने भिन्नात्मक सेकंड भी बदले ताकि डेटाटाइम उन्हें गोल नहीं करेंगे (ताकि दोनों मान बिल्कुल समान भिन्नात्मक भाग साझा करें)।
भले ही, डेटाटाइमऑफ़सेट अभी भी एक समय क्षेत्र ऑफ़सेट जोड़ता है, जो इसके डिफ़ॉल्ट मान +00:00 पर सेट होता है।
ध्यान दें कि मेरा सिस्टम datetimeoffset . पर अनुगामी शून्य प्रदर्शित करता है का भिन्नात्मक भाग है, लेकिन मान केवल 3 दशमलव स्थानों का उपयोग करता है।
उदाहरण 3 - संग्रहण आकार
डेटाटाइम डेटा प्रकार 8 बाइट्स का उपयोग करता है।
डेटाटाइमऑफ़सेट डेटा प्रकार इसकी शुद्धता के आधार पर या तो 8, 9, या 10 बाइट्स का उपयोग करता है।
इसलिए, आप डेटाटाइम . का उपयोग करके किसी भी संग्रहण आकार को सहेज नहीं रहे हैं ।
हालांकि, यदि आप एक डेटाटाइमऑफ़सेट . को रूपांतरित करते हैं बाइनरी स्थिरांक के लिए मान, यह सटीक स्टोर करने के लिए 1 बाइट जोड़ता है।
यदि हम DATALENGTH()
. का उपयोग करते हैं तो यहां क्या होता है हमारे प्रत्येक मान के लिए उपयोग किए गए बाइट्स की संख्या वापस करने के लिए कार्य करता है:
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = @thedatetimeoffset; SELECT DATALENGTH(@thedatetimeoffset) AS 'datetimeoffset', DATALENGTH(@thedatetime) AS 'datetime';
परिणाम
+------------------+------------+ | datetimeoffset | datetime | |------------------+------------| | 10 | 8 | +------------------+------------+
जैसा अपेक्षित था, डेटाटाइमऑफ़सेट . के लिए 10 बाइट्स और डेटाटाइम . के लिए 8 बाइट्स ।
लेकिन अगर हम उन्हें varbinary . में बदल दें , हम निम्नलिखित प्राप्त करते हैं:
DECLARE @thedatetimeoffset datetimeoffset(7), @thedatetime datetime; SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30'; SET @thedatetime = @thedatetimeoffset; SELECT DATALENGTH(CAST(@thedatetimeoffset AS varbinary(16))) AS 'datetimeoffset', DATALENGTH(CAST(@thedatetime AS varbinary(16))) AS 'datetime';
परिणाम
+------------------+------------+ | datetimeoffset | datetime | |------------------+------------| | 11 | 8 | +------------------+------------+
डेटाटाइमऑफ़सेट . में एक अतिरिक्त बाइट जोड़ा जाता है मान लेकिन डेटाटाइम . के लिए नहीं मूल्य। ऐसा इसलिए है क्योंकि डेटाटाइमऑफ़सेट मूल्य को सटीक स्टोर करने के लिए एक अतिरिक्त बाइट की आवश्यकता होती है (क्योंकि परिशुद्धता उपयोगकर्ता द्वारा परिभाषित है)। डेटाटाइम दूसरी ओर, मूल्य की एक निश्चित सटीकता होती है, इसलिए मूल्य के साथ सटीकता को संग्रहीत करने की कोई आवश्यकता नहीं है।
कई डेवलपर मानते हैं कि varbinary . में कनवर्ट करना यह प्रतिनिधि है कि SQL सर्वर वास्तव में दिनांक और समय मानों को कैसे संग्रहीत करता है। हालाँकि यह केवल आंशिक रूप से सच है।
हालांकि यह सच है कि SQL सर्वर अपने दिनांक और समय मानों को हेक्साडेसिमल में संग्रहीत करता है, उस हेक्स मान में वास्तव में डेटाटाइमऑफ़सेट संग्रहीत करते समय सटीकता शामिल नहीं होती है मूल्य। ऐसा इसलिए है क्योंकि सटीक कॉलम परिभाषा में शामिल है।
इस डेटा प्रकार को डेटाबेस में कैसे संग्रहीत किया जाता है, इस पर अधिक विवरण के लिए, SQL सर्वर में 'डेटाटाइमऑफ़सेट' संग्रहण आकार को समझना देखें।
क्या मुझे 'डेटाटाइम' या 'डेटाटाइमऑफ़सेट' का इस्तेमाल करना चाहिए?
यदि आपको समय क्षेत्र ऑफ़सेट शामिल करने की आवश्यकता है, तो आपको डेटाटाइमऑफ़सेट . का उपयोग करना होगा . यदि नहीं, तो डेटाटाइम पर्याप्त हो सकता है।
हालाँकि, Microsoft अनुशंसा करता है कि आप datetime2 . का उपयोग करें नए कार्य के लिए, क्योंकि इसके डेटाटाइम . से अधिक लाभ हैं .
इन डेटा प्रकारों की तुलना के लिए डेटाटाइम बनाम डेटाटाइम2 देखें।