SQL सर्वर में डेटटाइम बनाम डेटटाइम




sql-server tsql (10)

गैर-यूएस DATEFORMAT सेटिंग्स का उपयोग करते समय DATEFORMAT में डेट स्ट्रिंग्स की व्याख्या अलग-अलग हो सकती है। उदाहरण के लिए

set dateformat dmy
declare @d datetime, @d2 datetime2
select @d = '2013-06-05', @d2 = '2013-06-05'
select @d, @d2

यह डेटाटाइम के लिए 2013-05-06 (यानी 6 मई), और 2013-06-05 (यानी 5 जून) datetime2 2 के लिए आता है। हालांकि, dateformat साथ dateformat सेट, दोनों @d2 @d और @d2 वापसी 2013-06-05

SET DATEFORMAT व्यवहार SET DATEFORMAT के एमएसडीएन दस्तावेज के साथ बाधाओं में प्रतीत होता है जो कहता है: कुछ चरित्र स्ट्रिंग प्रारूप, उदाहरण के लिए आईएसओ 8601, को DATEFORMAT सेटिंग से स्वतंत्र रूप से व्याख्या किया जाता है । जाहिर है सच नहीं!

जब तक मैं इसे काट नहीं पाया, मैं हमेशा सोचा था कि yyyy-mm-dd तिथियों को भाषा / लोकेल सेटिंग्स के बावजूद, सही तरीके से संभाला जाएगा।

कौनसा:

SQL सर्वर 2008+ में दिनांक और समय को संग्रहीत करने का अनुशंसित तरीका है?

मुझे परिशुद्धता (और भंडारण स्थान शायद) में मतभेदों से अवगत है, लेकिन अब उनको अनदेखा कर रहा है, क्या इसका उपयोग करने के लिए सबसे अच्छा अभ्यास दस्तावेज है, या शायद हमें केवल datetime2 उपयोग करना चाहिए?


जबकि datetime2 साथ परिशुद्धता बढ़ी है, कुछ क्लाइंट दिनांक , समय या डेटाटाइम 2 का समर्थन नहीं करते हैं और आपको एक स्ट्रिंग अक्षर में कनवर्ट करने के लिए मजबूर करते हैं। विशेष रूप से माइक्रोसॉफ्ट इन डेटा प्रकारों के साथ "डाउन लेवल" ओडीबीसी, ओएलई डीबी, जेडीबीसी, और एसक्ल क्लाइंट मुद्दों का उल्लेख करता है और एक datetime2 दिखाता है कि प्रत्येक प्रकार किस प्रकार मैप कर सकता है।

यदि परिशुद्धता पर मूल्य संगतता , datetime उपयोग करें


पुराना प्रश्न ... लेकिन मैं कुछ भी जोड़ना चाहता हूं जो पहले से किसी ने भी नहीं बताया है ... (नोट: यह मेरा स्वयं का अवलोकन है, इसलिए किसी संदर्भ के लिए मत पूछें)

फ़िल्टर मानदंडों में उपयोग किए जाने पर डेटाटाइम 2 तेज होता है।

TLDR:

एसक्यूएल 2016 में मेरे पास सौ हजार पंक्तियों और एक डेटाटाइम कॉलम ENTRY_TIME के ​​साथ एक टेबल थी क्योंकि इसे सटीक समय सेकेंड तक स्टोर करना आवश्यक था। कई जॉइन और एक उप क्वेरी के साथ एक जटिल क्वेरी निष्पादित करते समय, जब मैंने इस खंड का उपयोग किया था:

WHERE ENTRY_TIME >= '2017-01-01 00:00:00' AND ENTRY_TIME < '2018-01-01 00:00:00'

क्वेरी शुरू में ठीक थी जब सैकड़ों पंक्तियां थीं, लेकिन जब पंक्तियों की संख्या में वृद्धि हुई, तो क्वेरी ने यह त्रुटि देना शुरू कर दिया:

Execution Timeout Expired. The timeout period elapsed prior
to completion of the operation or the server is not responding.

मैंने जहां खंड हटा दिया, और अप्रत्याशित रूप से, क्वेरी 1 सेकंड में चलाया गया था, हालांकि अब सभी तिथियों के लिए सभी पंक्तियां प्राप्त की गई थीं। मैं खंड के साथ आंतरिक क्वेरी चलाता हूं, और इसमें 85 सेकंड लगते हैं, और बिना किसी खंड के 0.01 सेकेंड लेते हैं।

डेटाटाइम फ़िल्टरिंग प्रदर्शन के रूप में मैं इस मुद्दे के लिए यहां कई धागे में आया था

मैंने थोड़ी सी क्वेरी अनुकूलित की। लेकिन मुझे मिली वास्तविक गति डेटाटाइम कॉलम को डेटाटाइम 2 में बदलकर थी।

अब वही क्वेरी जो पहले की गई थी, एक सेकंड से भी कम समय लेती है।

चियर्स


मुझे लगता है कि दिनांक स्टोर करने का बेहतर तरीका DATETIME2 है, क्योंकि इसमें DATETIME की तुलना में अधिक दक्षता है। SQL सर्वर 2008 में आप DATETIME2 का उपयोग कर सकते हैं, यह दिनांक और समय संग्रहीत करता है, स्टोर करने के लिए 6-8 बाइट लेता है और इसमें 100 नैनोसेकंड की सटीकता होती है। तो जो भी अधिक समय परिशुद्धता की आवश्यकता है वह DATETIME2 चाहता है।


मैं सिर्फ DATETIME2 लिए एक और लाभ में ठोकर खा रहा हूं: यह पाइथन adodbapi मॉड्यूल में एक बग से adodbapi है, जो एक मानक लाइब्रेरी adodbapi मान पास हो जाता है, जिसमें एक DATETIME कॉलम के लिए गैर-शून्य माइक्रोसेकंड होता है लेकिन कॉलम को परिभाषित किया गया है, तो ठीक काम करता है DATETIME2


यहां एक उदाहरण दिया गया है जो आपको स्टोरेज आकार (बाइट्स) में अंतर और स्मालडटाइम, डेटाटाइम, डेटाटाइम 2 (0), और डेटाटाइम 2 (7) के बीच सटीकता दिखाएगा:

DECLARE @temp TABLE (
    sdt smalldatetime,
    dt datetime,
    dt20 datetime2(0),
    dt27 datetime2(7)
)

INSERT @temp
SELECT getdate(),getdate(),getdate(),getdate()

SELECT sdt,DATALENGTH(sdt) as sdt_bytes,
    dt,DATALENGTH(dt) as dt_bytes,
    dt20,DATALENGTH(dt20) as dt20_bytes,
    dt27, DATALENGTH(dt27) as dt27_bytes FROM @temp

जो लौटता है

sdt                  sdt_bytes  dt                       dt_bytes  dt20                 dt20_bytes  dt27                         dt27_bytes
2015-09-11 11:26:00  4          2015-09-11 11:25:42.417  8         2015-09-11 11:25:42  6           2015-09-11 11:25:42.4170000  8

इसलिए यदि मैं जानकारी को दूसरे स्थान पर संग्रहीत करना चाहता हूं - लेकिन मिलीसेकंड पर नहीं - यदि मैं डेटाटाइम या डेटाटाइम 2 (7) के बजाय डेटाटाइम 2 (0) का उपयोग करता हूं तो मैं प्रत्येक 2 बाइट्स को सहेज सकता हूं।


इस आलेख के मुताबिक, यदि आप डेटटाइम 2 का उपयोग कर डेटटाइम की वही सटीकता चाहते हैं तो आपको बस डेटटाइम 2 (3) का उपयोग करना होगा। यह आपको एक ही परिशुद्धता देना चाहिए, एक कम बाइट लेना चाहिए, और विस्तारित सीमा प्रदान करना चाहिए।


datetime लिए एमएसडीएन दस्तावेज datetime का उपयोग करने की सिफारिश करता है। यहां उनकी सिफारिश है:

नए काम के लिए समय, दिनांक, डेटाटाइम 2 और डेटाटाइमसेट डेटा प्रकार का उपयोग करें। इन प्रकारों को एसक्यूएल मानक के साथ संरेखित करें। वे अधिक पोर्टेबल हैं। समय, डेटाटाइम 2 और डेटाटाइमसेट अधिक सेकंड सटीक प्रदान करते हैं। डेटाटाइमसेट वैश्विक स्तर पर तैनात अनुप्रयोगों के लिए समय क्षेत्र समर्थन प्रदान करता है।

डेटाटाइम 2 में बड़ी तिथि सीमा है, एक बड़ा डिफ़ॉल्ट fractional सटीक, और वैकल्पिक उपयोगकर्ता निर्दिष्ट सटीक है। उपयोगकर्ता द्वारा निर्दिष्ट परिशुद्धता के आधार पर यह कम भंडारण का उपयोग कर सकता है।


डेटाटाइम 2 को छोड़कर अधिकांश पहलुओं में जीत (पुराने ऐप्स संगतता)

  1. मूल्यों की बड़ी रेंज
  2. बेहतर शुद्धता
  3. छोटी भंडारण स्थान (यदि वैकल्पिक उपयोगकर्ता-निर्दिष्ट परिशुद्धता निर्दिष्ट है)

कृपया निम्नलिखित बिंदुओं को नोट करें

  • वाक्य - विन्यास
    • डेटाटाइम 2 [(fractional सेकंड सटीक => भंडारण आकार के नीचे देखो)]
  • प्रेसिजन, पैमाने
    • 100ns की सटीकता के साथ 0 से 7 अंक।
    • डिफ़ॉल्ट परिशुद्धता 7 अंक है।
  • भंडारण का आकार
    • 3 से कम परिशुद्धता के लिए 6 बाइट;
    • परिशुद्धता 3 और 4 के लिए 7 बाइट्स।
    • अन्य सभी परिशुद्धता के लिए 8 बाइट की आवश्यकता होती है
  • डेटटाइम 2 (3) में डेटटाइम के समान अंक हैं, लेकिन 8 बाइट के बजाय स्टोरेज के 7 बाइट्स का उपयोग करते हैं ( SQLHINTS- डेटटाइम बनाम डेटटाइम 2 )
  • डेटाटाइम 2 (ट्रांजैक्ट-एसक्यूएल एमएसडीएन आलेख) पर और जानें

छवि स्रोत: एमसीटीएस सेल्फ-पेस्ड ट्रेनिंग किट (परीक्षा 70-432): माइक्रोसॉफ्ट® एसक्यूएल सर्वर® 2008 - कार्यान्वयन और रखरखाव अध्याय 3: सारणी -> पाठ 1: सारणी बनाना -> पृष्ठ 66


Select ValidUntil + 1
from Documents

उपर्युक्त एसक्यूएल डेटटाइम 2 फ़ील्ड के साथ काम नहीं करेगा। यह रिटर्न और त्रुटि "ऑपरेंड प्रकार टकराव: डेटाटाइम 2 int के साथ असंगत है"

अगले दिन पाने के लिए 1 जोड़ना कुछ डेवलपर्स वर्षों से तिथियों के साथ कर रहा है। अब माइक्रोसॉफ्ट के पास एक सुपर नया डेटाटाइम 2 फ़ील्ड है जो इस सरल कार्यक्षमता को संभाल नहीं सकता है।

"आइए इस नए प्रकार का उपयोग करें जो पुराने से भी बदतर है", मुझे ऐसा नहीं लगता!





datetime2