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

SQL सर्वर में डेटाटाइम बनाम डेटाटाइम 2:क्या अंतर है?

यह लेख डेटाटाइम . के बीच मुख्य अंतरों की पड़ताल करता है और डेटाटाइम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 . का उपयोग करने के मामले को पुष्ट करता है डेटाटाइम . से अधिक नए डेटाबेस डिजाइन करते समय, खासकर यदि भंडारण आकार एक चिंता का विषय है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL केस संवेदनशील स्ट्रिंग तुलना करें

  2. SQL में एक शीर्ष स्तरीय अभिभावक ढूँढना

  3. SQL सर्वर चलाने वाले दो डॉकटर कंटेनरों के बीच एक लिंक्ड सर्वर बनाएँ (T-SQL उदाहरण)

  4. SQL सर्वर (T-SQL) में एक डेटाबेस मेल खाता बनाएँ

  5. MS SQL सर्वर में अटकी हुई प्रक्रियाओं का स्वचालित विलोपन