यह लेख डेटाटाइम . के बीच मुख्य अंतरों की पड़ताल करता है और डेटाटाइम2 SQL सर्वर में डेटा प्रकार।
यदि आप सुनिश्चित नहीं हैं कि किसका उपयोग करना है, तो datetime2 . का उपयोग करें (इसके फायदे नीचे देखें)।
यहां एक तालिका है जो इन दो प्रकारों के बीच महत्वपूर्ण अंतरों को रेखांकित करती है।
सुविधा | <वें शैली="चौड़ाई:40%;">दिनांक समय <वें शैली="चौड़ाई:40%;">डेटाटाइम2||
---|---|---|
एसक्यूएल कम्प्लायंट (एएनएसआई और आईएसओ 8601) | नहीं | हां |
तारीख सीमा | 1753-01-01 9999-12-31 तक | 0001-01-01 9999-12-31 तक |
समय सीमा | 00:00:00 से 23:59:59.97 तक | 00:00:00 23:59:59.99999999 तक |
चरित्र की लंबाई | न्यूनतम 19 स्थान अधिकतम 23 | न्यूनतम 19 स्थान अधिकतम 27 |
भंडारण आकार | 8 बाइट्स | 6 से 8 बाइट्स, सटीकता पर निर्भर करता है* * शुद्धता को स्टोर करने के लिए प्लस 1 बाइट |
सटीकता | .000, .003, या .007 सेकंड की वृद्धि के लिए पूर्णांकित | 100 नैनोसेकंड |
उपयोगकर्ता द्वारा परिभाषित भिन्नात्मक दूसरी परिशुद्धता | नहीं | हां |
समय क्षेत्र ऑफसेट | कोई नहीं | कोई नहीं |
समय क्षेत्र ऑफसेट जागरूक और संरक्षण | नहीं | नहीं |
डेलाइट सेविंग अवेयर | नहीं | नहीं |
'डेटाटाइम2' के फ़ायदे
जैसा कि उपरोक्त तालिका में देखा गया है, datetime2 प्रकार के डेटाटाइम . से अधिक लाभ हैं , सहित:
- बड़ी तिथि सीमा
- अधिक डिफ़ॉल्ट भिन्नात्मक परिशुद्धता
- वैकल्पिक उपयोगकर्ता-निर्दिष्ट सटीकता
- उच्च सटीकता, यहां तक कि डेटाटाइम . के समान दशमलव स्थानों का उपयोग करने पर भी (यानी 3)
- दशमलव स्थानों की समान संख्या का उपयोग करते समय कम संग्रहण आकार डेटाटाइम , फिर भी उच्च सटीकता के साथ*
- डेटाटाइम की तुलना में 2 बाइट कम संग्रहण का उपयोग करने का विकल्प (यद्यपि कम सटीकता के साथ)*
- एसक्यूएल मानकों (एएनएसआई और आईएसओ 8601) के साथ संरेखित करता है
* कुछ मामलों में datetime2 value सटीकता को संग्रहीत करने के लिए एक अतिरिक्त बाइट का उपयोग करता है, जिसके परिणामस्वरूप संग्रहण आकार डेटाटाइम के समान होगा दशमलव स्थानों की समान संख्या का उपयोग करते समय। इसके बारे में और जानने के लिए पढ़ें।
क्या मुझे 'डेटाटाइम' या 'डेटाटाइम2' का इस्तेमाल करना चाहिए?
Microsoft अनुशंसा करता है datetime2 डेटाटाइम . से अधिक नए काम के लिए (और ऊपर सूचीबद्ध उन्हीं कारणों से)।
इसलिए, आपको datetime2 . का उपयोग करना चाहिए , जब तक कि आपके पास न करने का कोई विशिष्ट कारण न हो (जैसे कि किसी लीगेसी सिस्टम के साथ काम करना)।
उदाहरण 1 - मूल तुलना
डेटाटाइम . के बीच मूलभूत अंतर को प्रदर्शित करने के लिए यहां एक त्वरित उदाहरण दिया गया है और डेटाटाइम2 ।
DECLARE @thedatetime2 datetime2(7), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5555555'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
परिणाम:
+-----------------------------+-------------------------+ | datetime2 | datetime | |-----------------------------+-------------------------| | 2025-05-21 10:15:30.5555555 | 2025-05-21 10:15:30.557 | +-----------------------------+-------------------------+
यहां, मैंने एक डेटाटाइम . सेट किया है datetime2 . के समान मान के लिए परिवर्तनीय चर। इससे मान डेटाटाइम . में रूपांतरित हो जाता है और फिर हम एक SELECT
. का उपयोग कर सकते हैं परिणाम देखने के लिए बयान।
इस मामले में, datetime2 चर 7 के पैमाने का उपयोग करता है, जिसका अर्थ है 7 दशमलव स्थान। डेटाटाइम दूसरी ओर, मान केवल 3 दशमलव स्थानों का उपयोग करता है, और इसके अंतिम भिन्नात्मक अंक को गोल किया जाता है (क्योंकि यह डेटा प्रकार भिन्नात्मक सेकंड को .000, .003, या .007 सेकंड की वृद्धि के लिए गोल करता है)।
उदाहरण 2 - 3 दशमलव स्थानों का उपयोग करना
अगर मैं डेटाटाइम2 . को कम कर दूं 3 का पैमाना (डेटाटाइम . से मेल खाने के लिए) ), यहाँ क्या होता है।
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5555555'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
परिणाम:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.556 | 2025-05-21 10:15:30.557 | +-------------------------+-------------------------+
तो डेटाटाइम2 इस मामले में मूल्य भी गोल किया गया है। हालांकि, इसे केवल 556 . तक गोल किया गया है - यह 557 . तक नहीं जाता है जैसे डेटाटाइम मान करता है।
बेशक, इसका एकमात्र कारण datetime2 . है मान को पूर्णांकित किया जाता है क्योंकि निम्न अंक 5 या अधिक है। यदि हम निम्नलिखित अंक को कम करते हैं, तो कोई गोलाई नहीं की जाती है:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5554444'; SET @thedatetime = @thedatetime2; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
परिणाम:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.555 | 2025-05-21 10:15:30.557 | +-------------------------+-------------------------+
हालांकि, डेटाटाइम मूल्य का पूर्णांकन जारी है।
उदाहरण 3 - स्ट्रिंग लिटरल्स से मान सेट करना
पिछले उदाहरणों में, दिनांक मान को datetime2 . के समान मान पर सेट करके असाइन किया गया था मूल्य। जब हम ऐसा करते हैं, तो SQL सर्वर डेटा को नए डेटा प्रकार को "फिट" करने के लिए एक अंतर्निहित रूपांतरण करता है।
हालांकि, अगर हम डेटाटाइम . को समान स्ट्रिंग अक्षरशः असाइन करने का प्रयास करते हैं वैरिएबल जिसे हमने datetime2 . को असाइन किया है , हमें एक त्रुटि मिलती है:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5554444'; SET @thedatetime = '2025-05-21 10:15:30.5554444'; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
परिणाम:
Msg 241, Level 16, State 1, Line 5 Conversion failed when converting date and/or time from character string.
ऐसा इसलिए है क्योंकि डेटाटाइम केवल 3 या उससे कम भिन्नात्मक सेकंड वाले स्ट्रिंग अक्षर स्वीकार करता है।
इसलिए इस समस्या को दूर करने के लिए, हमें भिन्नात्मक भाग को केवल 3 (या कम) दशमलव स्थानों तक कम करने की आवश्यकता है।
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5554444'; SET @thedatetime = '2025-05-21 10:15:30.555'; SELECT @thedatetime2 AS 'datetime2', @thedatetime AS 'datetime';
परिणाम:
+-------------------------+-------------------------+ | datetime2 | datetime | |-------------------------+-------------------------| | 2025-05-21 10:15:30.555 | 2025-05-21 10:15:30.557 | +-------------------------+-------------------------+
डेटाटाइम2 3 के पैमाने का उपयोग करते समय भी type में यह सीमा नहीं होती है।
उदाहरण 4 - संग्रहण आकार
डेटाटाइम डेटा प्रकार में 8 बाइट्स का एक निश्चित भंडारण आकार होता है।
डेटाटाइम2 दूसरी ओर, इसकी शुद्धता के आधार पर, 6, 7, या 8 बाइट्स हो सकते हैं।
3 दशमलव स्थानों का उपयोग करते समय, datetime2 केवल 7 बाइट्स का उपयोग करता है, जिसका अर्थ है कि यह डेटाटाइम . से कम संग्रहण स्थान का उपयोग करता है (अधिक सटीकता के साथ)।
हालाँकि, Microsoft बताता है कि datetime2 type इसकी शुद्धता को स्टोर करने के लिए 1 अतिरिक्त बाइट का भी उपयोग करता है। तो इस मामले में, यह 8 बाइट्स का उपयोग करेगा। और इसलिए हम पिछले कथन को यह कहकर संशोधित कर सकते हैं कि यह 7, 8, या 9 बाइट्स का उपयोग करता है।
हालाँकि, यह शायद इस बात पर निर्भर करता है कि हम इसे किसी तालिका या चर में संग्रहीत कर रहे हैं, और हम इसे बाइनरी स्थिरांक में परिवर्तित कर रहे हैं या नहीं।
यदि हम DATALENGTH()
. का उपयोग करते हैं तो यहां क्या होता है हमारे प्रत्येक मान के लिए उपयोग किए गए बाइट्स की संख्या वापस करने के लिए कार्य करता है:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5554444'; SET @thedatetime = @thedatetime2; SELECT DATALENGTH(@thedatetime2) AS 'datetime2', DATALENGTH(@thedatetime) AS 'datetime';
परिणाम
+-------------+------------+ | datetime2 | datetime | |-------------+------------| | 7 | 8 | +-------------+------------+
लेकिन अगर हम उन्हें varbinary . में बदल दें , हम निम्नलिखित प्राप्त करते हैं:
DECLARE @thedatetime2 datetime2(3), @thedatetime datetime; SET @thedatetime2 = '2025-05-21 10:15:30.5554444'; SET @thedatetime = @thedatetime2; SELECT DATALENGTH(CONVERT(VARBINARY(16),@thedatetime2)) AS 'datetime2', DATALENGTH(CONVERT(VARBINARY(16),@thedatetime)) AS 'datetime';
परिणाम
+-------------+------------+ | datetime2 | datetime | |-------------+------------| | 8 | 8 | +-------------+------------+
तो डेटाटाइम2 varbinary . में परिवर्तित होने पर एक अतिरिक्त बाइट का उपयोग करता है , इस प्रकार इसे डेटाटाइम . के समान संग्रहण आकार में लाया जाता है ।
हालांकि, निम्न उदाहरण से पता चलता है कि जब डेटा डेटाबेस कॉलम में संग्रहीत किया जाता है, तो हमें datetime2 के लिए 7 बाइट्स की लंबाई मिलती है। और डेटाटाइम . के लिए 8 बाइट्स ।
डेटाटाइम2 को संग्रहीत करते समय डेटाबेस में मान, कॉलम परिभाषा में परिशुद्धता शामिल है। इस मामले में प्रत्येक पंक्ति के मानों को सटीकता को संग्रहीत करने के लिए अतिरिक्त बाइट की आवश्यकता नहीं होती है, और हम कह सकते हैं कि datetime2 डेटाटाइम . से कम संग्रहण स्थान का उपयोग करता है भिन्नात्मक सेकंड की समान संख्या का उपयोग करते समय।
उदाहरण 5 - संग्रहीत डेटा के लिए संग्रहण आकार
इस उदाहरण में, मैं एक डेटाबेस बनाता हूं और COL_LENGTH
. का उपयोग करता हूं प्रत्येक कॉलम की लंबाई, बाइट्स में वापस करने के लिए। फिर मैं एक डेटाटाइम2 . सम्मिलित करता हूं और डेटाटाइम इसमें मूल्य दें और DBCC PAGE()
. का उपयोग करें पृष्ठ फ़ाइल में वास्तविक डेटा की लंबाई खोजने के लिए। यह हमें वह संग्रहण स्थान दिखाता है जिसका उपयोग प्रत्येक डेटा प्रकार डेटाबेस में संग्रहीत करते समय करता है।
एक डेटाबेस बनाएं:
CREATE DATABASE CompareTypes;
एक टेबल बनाएं:
USE CompareTypes; CREATE TABLE Datetime2vsDatetime ( TheDateTime datetime, TheDateTime2 datetime2(3) );
इस मामले में मैं दो कॉलम बनाता हूं - एक डेटाटाइम . है कॉलम और दूसरा एक datetime2 . है कॉलम।
कॉलम की लंबाई जांचें
प्रत्येक कॉलम की लंबाई (बाइट्स में) जांचें:
SELECT COL_LENGTH ( 'dbo.Datetime2vsDatetime' , 'TheDateTime2' ) AS 'datetime2', COL_LENGTH ( 'dbo.Datetime2vsDatetime' , 'TheDateTime' ) AS 'datetime';
परिणाम:
+-------------+------------+ | datetime2 | datetime | |-------------+------------| | 7 | 8 | +-------------+------------+
तो हम देखते हैं कि datetime2 डेटाटाइम . की तुलना में कॉलम की लंबाई 7 बाइट्स है की लंबाई 8 बाइट्स है।
डेटा डालें
अब वास्तविक दिनांक और समय मानों के संग्रहण आकार को देखते हैं जब वे SQL सर्वर में संग्रहीत होते हैं। हम DBCC PAGE()
use का उपयोग कर सकते हैं डेटा फ़ाइल में वास्तविक पृष्ठ का निरीक्षण करने के लिए।
लेकिन पहले, हमें अपने कॉलम में डेटा डालने की जरूरत है।
डेटा डालें:
DECLARE @thedatetime2 datetime2 = '2025-05-21 10:15:30.5554444'; INSERT INTO Datetime2vsDatetime ( TheDateTime, TheDateTime2 ) SELECT @thedatetime2, @thedatetime2;
डेटा चुनें (बस इसे जांचने के लिए):
SELECT * FROM Datetime2vsDatetime;
परिणाम:
+-------------------------+-------------------------+ | TheDateTime | TheDateTime2 | |-------------------------+-------------------------| | 2025-05-21 10:15:30.557 | 2025-05-21 10:15:30.555 | +-------------------------+-------------------------+
डीबीसीसी पेज का उपयोग करना()
यहां हम DBCC PAGE()
का उपयोग करते हैं डेटा फ़ाइल में वास्तविक पृष्ठ का निरीक्षण करने के लिए।
सबसे पहले, हम DBCC IND()
का उपयोग करेंगे पेजपीआईडी खोजने के लिए:
DBCC IND('CompareTypes', 'dbo.Datetime2vsDatetime', 0);
परिणाम (ऊर्ध्वाधर आउटपुट का उपयोग करके):
-[ RECORD 1 ]------------------------- PageFID | 1 PagePID | 307 IAMFID | NULL IAMPID | NULL ObjectID | 885578193 IndexID | 0 PartitionNumber | 1 PartitionID | 72057594042974208 iam_chain_type | In-row data PageType | 10 IndexLevel | NULL NextPageFID | 0 NextPagePID | 0 PrevPageFID | 0 PrevPagePID | 0 -[ RECORD 2 ]------------------------- PageFID | 1 PagePID | 320 IAMFID | 1 IAMPID | 307 ObjectID | 885578193 IndexID | 0 PartitionNumber | 1 PartitionID | 72057594042974208 iam_chain_type | In-row data PageType | 1 IndexLevel | 0 NextPageFID | 0 NextPagePID | 0 PrevPageFID | 0 PrevPagePID | 0
यह दो रिकॉर्ड देता है। हम 1 के पेज टाइप (दूसरा रिकॉर्ड) में रुचि रखते हैं। हम उस रिकॉर्ड से PagePID चाहते हैं। इस मामले में पेजपीआईडी 320 . है ।
अब हम उस पेजपीआईडी को ले सकते हैं और इसे निम्नलिखित में उपयोग कर सकते हैं:
DBCC TRACEON(3604, -1); DBCC PAGE(CompareTypes, 1, 320, 3);
यह बहुत अधिक डेटा उत्पन्न करता है, लेकिन हम मुख्य रूप से निम्नलिखित भाग में रुचि रखते हैं:
Slot 0 Column 1 Offset 0x4 Length 8 Length (physical) 8 TheDateTime = 2025-05-21 10:15:30.557 Slot 0 Column 2 Offset 0xc Length 7 Length (physical) 7 TheDateTime2 = 2025-05-21 10:15:30.555
यह दर्शाता है कि डेटाटाइम 8 बाइट्स की लंबाई और datetime2(3) . का उपयोग करता है डेटाबेस में संग्रहीत होने पर 7 बाइट्स का उपयोग करता है।
तो यह datetime2 . का उपयोग करने के मामले को पुष्ट करता है डेटाटाइम . से अधिक नए डेटाबेस डिजाइन करते समय, खासकर यदि भंडारण आकार एक चिंता का विषय है।