Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में datetime2 बनाम datetimeoffset:क्या अंतर है?

यह लेख datetime2 . के बीच मुख्य अंतरों को देखता है और डेटाटाइमऑफ़सेट SQL सर्वर में डेटा प्रकार।

दोनों डेटा प्रकारों का उपयोग दिनांक और समय मानों को संग्रहीत करने के लिए किया जाता है। दोनों बहुत समान हैं, लेकिन एक महत्वपूर्ण अंतर के साथ; डेटाटाइमऑफ़सेट समय क्षेत्र ऑफसेट स्टोर करता है।

इसका परिणाम डेटाटाइमऑफ़सेट . में भी होता है datetime2 . से अधिक संग्रहण स्थान का उपयोग करना , इसलिए आप केवल डेटाटाइमऑफ़सेट . का उपयोग करेंगे अगर आपको समय क्षेत्र ऑफ़सेट चाहिए.

यहां एक तालिका है जो इन दो प्रकारों के बीच महत्वपूर्ण अंतरों को रेखांकित करती है।

<वें शैली ="चौड़ाई:40%;">डेटाटाइमऑफ़सेट <वें शैली="चौड़ाई:40%;">डेटाटाइम2
सुविधा
एसक्यूएल कम्प्लायंट (एएनएसआई और आईएसओ 8601) हां हां
तारीख सीमा 0001-01-01 से 9999-12-31 तक 0001-01-01 से 9999-12-31 तक
समय सीमा 00:00:00 से 23:59:59.99999999 00:00:00 से 23:59:59.99999999
चरित्र की लंबाई 26 स्थान न्यूनतम
34 अधिकतम
न्यूनतम 19 स्थान
अधिकतम 27
भंडारण आकार 8 से 10 बाइट्स, सटीकता पर निर्भर करता है*

* शुद्धता को स्टोर करने के लिए प्लस 1 बाइट

6 से 8 बाइट्स, सटीकता पर निर्भर करता है*

* शुद्धता को स्टोर करने के लिए प्लस 1 बाइट

सटीकता 100 नैनोसेकंड 100 नैनोसेकंड
आंशिक दूसरी सटीकता हां हां
उपयोगकर्ता द्वारा परिभाषित भिन्नात्मक दूसरी परिशुद्धता हां हां
समय क्षेत्र ऑफ़सेट रेंज -14:00 से +14:00 कोई नहीं
समय क्षेत्र ऑफसेट जागरूक और संरक्षण हां नहीं
डेलाइट सेविंग अवेयर नहीं नहीं

क्या मुझे 'datetime2' या 'datetimeoffset' का उपयोग करना चाहिए?

यह इस बात पर निर्भर करता है कि आपको समय क्षेत्र ऑफ़सेट शामिल करने की आवश्यकता है या नहीं।

यदि आपको समय क्षेत्र ऑफ़सेट शामिल करने की आवश्यकता है, तो आपको डेटाटाइमऑफ़सेट . का उपयोग करना होगा .

यदि नहीं, तो डेटाटाइम2 . का उपयोग करें , क्योंकि आप संग्रहण स्थान को बचाएंगे और अपने डेटा में एक (संभावित रूप से गलत) समय क्षेत्र ऑफसेट होने के साथ किसी भी संभावित समस्या को समाप्त करेंगे।

उदाहरण 1 - मूल तुलना

datetime2 . के बीच मूलभूत अंतर को प्रदर्शित करने के लिए यहां एक त्वरित उदाहरण दिया गया है और डेटाटाइमऑफ़सेट

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(7);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

परिणाम:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.5555555 +07:30 | 2025-05-21 10:15:30.5555555 |
+------------------------------------+-----------------------------+

यहां, मैंने एक डेटाटाइम2 . सेट किया है डेटाटाइमऑफ़सेट . के समान मान के लिए परिवर्तनीय चर। इससे मान datetime2 . में रूपांतरित हो जाता है और फिर हम एक SELECT . का उपयोग कर सकते हैं प्रत्येक चर के मूल्य को देखने के लिए कथन।

दोनों चर 7 के पैमाने का उपयोग करते हैं, जिसका अर्थ है कि उनके पास 7 दशमलव स्थान हैं।

तो इस मामले में, दोनों के बीच एकमात्र अंतर यह है कि डेटाटाइमऑफ़सेट मान में समय क्षेत्र ऑफ़सेट और datetime2 . शामिल हैं मान नहीं है।

उदाहरण 2 - शुद्धता बदलना

दोनों प्रकार आपको सटीकता निर्दिष्ट करने की अनुमति देते हैं (0 और 7 के बीच के पैमाने का उपयोग करके)। इसलिए, डेटाटाइम2 . सेट करना संभव है डेटाटाइमऑफ़सेट . की तुलना में कम सटीकता के लिए मान मूल्य (और इसके विपरीत)।

उदाहरण:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

परिणाम:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.5555555 +07:30 | 2025-05-21 10:15:30.556 |
+------------------------------------+-------------------------+

यहां मैंने डेटाटाइम2 . सेट किया है 3 के पैमाने पर मान, जिसका अर्थ है कि यह 7 के बजाय 3 दशमलव स्थानों के साथ समाप्त होता है। इस मामले में, इसके भिन्नात्मक सेकंड को गोल किया जाता है (क्योंकि अगला भिन्नात्मक अंक 5 या अधिक है)।

इसलिए हम देख सकते हैं कि हमारे द्वारा datetime2 को असाइन किए गए भिन्नात्मक सेकंड के आधार पर एक भिन्न दिनांक/समय मान प्राप्त करना संभव है . यह दूसरे तरीके से भी काम करता है (जैसे अगर हम datetime2(7) . से कनवर्ट करते हैं से डेटाटाइमऑफ़सेट(3) )।

हालांकि, अगर हम भिन्नात्मक भाग को कम करते हैं, तो कोई गोलाई नहीं की जाती है:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(3);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5554444 +07:30';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

परिणाम:

+------------------------------------+-------------------------+
| datetimeoffset                     | datetime2               |
|------------------------------------+-------------------------|
| 2025-05-21 10:15:30.5554444 +07:30 | 2025-05-21 10:15:30.555 |
+------------------------------------+-------------------------+

उदाहरण 3 - स्ट्रिंग लिटरल्स से मान सेट करना

पिछले उदाहरणों में, datetime2 मान को डेटाटाइमऑफ़सेट . के समान मान पर सेट करके असाइन किया गया था मूल्य। जब हम ऐसा करते हैं, तो SQL सर्वर डेटा को नए डेटा प्रकार को "फिट" करने के लिए एक अंतर्निहित रूपांतरण करता है।

हम वही मान सीधे datetime2 . को भी निर्दिष्ट कर सकते हैं चर (भले ही आधिकारिक दस्तावेज स्पष्ट रूप से यह नहीं बताता है कि यह एक समय क्षेत्र ऑफसेट के साथ एक स्ट्रिंग अक्षर को स्वीकार करता है):

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(7);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30';
SET @thedatetime2 = '2025-05-21 10:15:30.5555555 +07:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedatetime2 AS 'datetime2';

परिणाम:

+------------------------------------+-----------------------------+
| datetimeoffset                     | datetime2                   |
|------------------------------------+-----------------------------|
| 2025-05-21 10:15:30.5555555 +07:30 | 2025-05-21 10:15:30.5555555 |
+------------------------------------+-----------------------------+

उदाहरण 4 - संग्रहण आकार

डेटाटाइम2 डेटा प्रकार डेटाटाइमऑफ़सेट . की तुलना में दो बाइट कम संग्रहण का उपयोग करता है किसी भी सटीकता के लिए।

डेटाटाइम2 इसकी शुद्धता के आधार पर, 6, 7, या 8 बाइट्स हो सकते हैं।

डेटाटाइमऑफ़सेट इसकी शुद्धता के आधार पर या तो 8, 9, या 10 बाइट्स हो सकते हैं।

Microsoft बताता है कि datetime2 type अपनी सटीकता को संग्रहीत करने के लिए 1 अतिरिक्त बाइट का भी उपयोग करता है, इस स्थिति में यह smalldatetime से कम से कम 3 बाइट अधिक का उपयोग करेगा। ।

यह डेटाटाइमऑफ़सेट . पर भी लागू होता है (भले ही यह Microsoft प्रलेखन में स्पष्ट रूप से नहीं कहा गया है)।

हालाँकि, यह इस बात पर निर्भर करता है कि हम इसे किसी तालिका या चर में संग्रहीत कर रहे हैं, और हम इसे बाइनरी स्थिरांक में परिवर्तित कर रहे हैं या नहीं।

यदि हम DATALENGTH() . का उपयोग करते हैं तो यहां क्या होता है हमारे प्रत्येक मान के लिए उपयोग किए गए बाइट्स की संख्या वापस करने के लिए कार्य करता है:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(7);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  DATALENGTH(@thedatetimeoffset) AS 'datetimeoffset',
  DATALENGTH(@thedatetime2) AS 'datetime2';

परिणाम

+------------------+-------------+
| datetimeoffset   | datetime2   |
|------------------+-------------|
| 10               | 8           |
+------------------+-------------+

जैसा अपेक्षित था, डेटाटाइमऑफ़सेट . के लिए 10 बाइट्स और datetime2 . के लिए 8 बाइट्स ।

लेकिन अगर हम उन्हें varbinary . में बदल दें , हम निम्नलिखित प्राप्त करते हैं:

DECLARE 
  @thedatetimeoffset datetimeoffset(7), 
  @thedatetime2 datetime2(7);
SET @thedatetimeoffset = '2025-05-21 10:15:30.5555555 +07:30';
SET @thedatetime2 = @thedatetimeoffset;
SELECT 
  DATALENGTH(CAST(@thedatetimeoffset AS varbinary(16))) AS 'datetimeoffset',
  DATALENGTH(CAST(@thedatetime2 AS varbinary(16))) AS 'datetime2';

परिणाम

+------------------+-------------+
| datetimeoffset   | datetime2   |
|------------------+-------------|
| 11               | 9           |
+------------------+-------------+

सटीकता को स्टोर करने के लिए प्रत्येक मान में एक अतिरिक्त बाइट जोड़ा जाता है।

कई डेवलपर मानते हैं कि varbinary . में कनवर्ट करना यह प्रतिनिधि है कि SQL सर्वर वास्तव में दिनांक और समय मानों को कैसे संग्रहीत करता है। हालाँकि यह केवल आंशिक रूप से सच है।

हालांकि यह सच है कि SQL सर्वर अपने दिनांक और समय मानों को हेक्साडेसिमल में संग्रहीत करता है, लेकिन उस हेक्स मान में वास्तव में सटीकता शामिल नहीं होती है। ऐसा इसलिए है क्योंकि सटीक कॉलम परिभाषा में शामिल है। लेकिन जब हम varbinary . में कनवर्ट करते हैं जैसा कि हमने पिछले उदाहरण में किया था, सटीकता पहले से तैयार है, और यह एक अतिरिक्त बाइट जोड़ता है।

इन डेटा प्रकारों को विभिन्न संदर्भों में कैसे संग्रहीत किया जाता है, इसके बारे में अधिक विवरण के लिए, निम्नलिखित लेख देखें:

  • SQL सर्वर में 'डेटाटाइमऑफ़सेट' संग्रहण आकार को समझना
  • SQL सर्वर में 'datetime2' संग्रहण आकार को समझना

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका या अनुक्रमित दृश्य पर CONTAINS या FREETEXT विधेय का उपयोग नहीं कर सकता क्योंकि यह पूर्ण-पाठ अनुक्रमित नहीं है

  2. कॉलम द्वारा समूह और एकाधिक पंक्तियों को एक पंक्ति एकाधिक कॉलम में समूहित करें

  3. पहली बार इसे देखने वालों के लिए MS SQL सर्वर का विश्लेषण

  4. मैं टीएसक्यूएल का उपयोग कर डेटाबेस में सभी तालिकाओं की सूची कैसे प्राप्त करूं?

  5. SQL सर्वर में SCHEMA_ID () कैसे काम करता है