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