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


762

कौनसा:

है एसक्यूएल सर्वर 2008 + में दुकान की तारीख और समय के लिए सिफारिश की तरीका है?

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

जवाबों:


641

के लिए MSDN प्रलेखीकरण datetime उपयोग करने की सलाह datetime2 । यहाँ उनकी सिफारिश है:

का प्रयोग करें time, date, datetime2और datetimeoffsetनए काम के लिए डेटा प्रकार। ये प्रकार SQL मानक के साथ संरेखित होते हैं। वे अधिक पोर्टेबल हैं। time, datetime2और datetimeoffset अधिक सेकंड सटीक प्रदान करते हैं। datetimeoffsetविश्व स्तर पर तैनात अनुप्रयोगों के लिए समय क्षेत्र का समर्थन प्रदान करता है।

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


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

4
एक अन्य विकल्प संगतता के लिए डेटाटाइम के रूप में परिवर्तित कॉलम के साथ अनुक्रमित दृश्य का उपयोग करना है। हालाँकि, आपको एप्लिकेशन को दृश्य में इंगित करने में सक्षम होने की आवश्यकता होगी।
TamusJRoyce

9
DATETIMEOFFSET के साथ समय क्षेत्र का समर्थन एक मिथ्या नाम है। यह केवल एक विशिष्ट समय के लिए एक यूटीसी ऑफसेट स्टोर करता है, न कि एक समय क्षेत्र।
सनकैट २२

5
@ पोरद: "एसक्यूएल स्टैंडर्ड" होने के कारण "" अधिक पोर्टेबल "होने के अभ्यास में वास्तव में क्या लाभ है? यह इसके अलावा आपको और अधिक कोड लिखने के लिए है जो एक" RD "के लिए" पोर्ट "के लिए काफी कम पठनीय / रखरखाव योग्य है जो कि उस कोड के जीवन के लिए कभी भी होने की संभावना नहीं है। शायद Microsoft द्वारा प्रदान किए गए SQL सर्वर उपकरण और ड्राइवर्स के अलावा अन्य (यदि भी हो), क्या वास्तव में कोई भी एप्लिकेशन हैं जो DateTime2टाइप के विशिष्ट बिट-स्तरीय अभ्यावेदन (या किसी अन्य SQL सर्वर ) पर भरोसा करते हैं उस मामले के लिए टाइप करें); मेरे 7/10/17 में विपक्ष देखें कि मैं क्यों पूछ रहा हूं, इसका उत्तर दें।
टॉम

2
@ एडमोर पोरड: इसके अलावा, उन सभी लाभों की संभावना है (इंजीनियरिंग या वैज्ञानिक ऐप्स के बाहर) और इसलिए लाभ के नुकसान के लायक नहीं है, बहुत अधिक संभावना की आवश्यकता है: बहुत आसान (वर्कअराउंड पर विचार करते हुए) अंतर्निहित या स्पष्ट रूप से परिवर्तित करने की क्षमता फ़्लोटिंग-पॉइंट न्यूमेरिक (# दिनों का incl। if appl।, आंशिक तिथि के बाद का आंशिक समय) परिवर्धन, घटाव, न्यूनतम, मैक्सिमम और औसत के लिए मान। विवरण के लिए नीचे मेरे 7/10/17 उत्तर में विपक्ष देखें।
टॉम

493

DATETIME2" DATETIME9999/12/31 " के माध्यम से " 0001/01/01 " की एक तिथि सीमा है, जबकि प्रकार केवल वर्ष 1753-9999 का समर्थन करता है।

इसके अलावा, यदि आपको जरूरत है, तो DATETIME2समय के संदर्भ में अधिक सटीक हो सकता है; DATETIME 3 1/3 मिलीसेकंड तक सीमित है, जबकि DATETIME2100ns तक सटीक हो सकता है।

System.DateTime.NET में दोनों प्रकार के मानचित्र - वहां कोई अंतर नहीं है।

यदि आपके पास विकल्प है, तो मैं DATETIME2जब भी संभव हो उपयोग करने की सलाह दूंगा। मुझे कोई लाभ नहीं दिखाई दे रहा है DATETIME(पिछड़े अनुकूलता को छोड़कर) - आपको कम परेशानी होगी (तारीखें सीमा से बाहर होने और इस तरह परेशानी)।

प्लस: यदि आपको केवल दिनांक (समय भाग के बिना) की आवश्यकता है, तो DATE का उपयोग करें - यह उतना ही अच्छा है DATETIME2और आपको स्थान बचाता है! :-) एक ही समय के लिए चला जाता है - उपयोग TIME। यही इस प्रकार के हैं!


157
SqlCommand के पैरामीटर के रूप में .NET DateTime मान जोड़ते समय सावधान रहें, क्योंकि यह मान लेना पसंद है कि यह पुराना डेटाटाइम प्रकार है, और यदि आप उस दिनांक समय मान को लिखने का प्रयास करते हैं तो आपको एक त्रुटि मिलेगी जो कि 1753-9999 वर्ष की सीमा के बाहर है जब तक आप SqlParameter के लिए System.Data.SqlDbType.DateTime2 के रूप में स्पष्ट रूप से टाइप नहीं करते हैं। वैसे भी, डेटाटाइम 2 बहुत अच्छा है, क्योंकि यह किसी भी मूल्य को संग्रहीत कर सकता है जो .NET डेटटाइम प्रकार में संग्रहीत किया जा सकता है।
त्रिकोको

10
@marc_s - क्या यह अशक्त नहीं है?
जॉनफेक्स

8
@JohnFX - यहाँ थोड़ी देर हो गई - लेकिन आप अशक्त होने के लिए एक डेटाइम सेट नहीं करेंगे। आप अशक्त <डेटाइम> या डेटाइम का उपयोग करेंगे? कौन सा ठीक ठीक संभालता है - और एक खरीद करने के लिए मानचित्रण में बस करना होगा param.value = someDateTime ?? DBValue.Null इसके दुर्भाग्यपूर्ण है कि हम एक नंबर के साथ एक डेटाप्रकार साथ समस्या आ रही के बाद यह - बस इतना 'सामान्य' लगता है:)
एडम Tuliper - MSFT

69
लोल, मैंने सिर्फ अपनी टिप्पणी (ऊपर) को उकेरने की कोशिश की, इससे पहले कि मुझे एहसास हुआ कि यह मेरी अपनी टिप्पणी थी (एक साल पहले की गई थी)। जब तक आप स्पष्ट रूप से इसे और अधिक सटीक SqlDbType.DateTime2 पर सेट नहीं करते हैं, तब तक डिफ़ॉल्ट रूप से सभी डेटाइम मानों को हटाने के लिए मैं .NET फ्रेमवर्क के गूंगे डिजाइन निर्णय के साथ काम कर रहा हूं। सही प्रकार का अनुमान लगाने के लिए इतना ही। वास्तव में, उन्हें परिवर्तन को पारदर्शी बनाना चाहिए था, कम सटीक, कम कुशल, सीमित-सीमा के कार्यान्वयन की जगह, और मूल "डेटाटाइम" प्रकार का नाम रखा। यह भी देखें stackoverflow.com/q/8421332/88409
Triynko

5
@marc_s यह नहीं है कि Nullable<DateTime>इसके लिए क्या है?
क्रिस डब्ल्यूडब्ल्यू

207

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

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

SQL दिनांक और समय डेटा प्रकारों की तुलना - डेटाइम, डेटाटाइम 2, दिनांक, समय

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

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

छवि स्रोत: MCTS स्व-प्रशिक्षित प्रशिक्षण किट (परीक्षा 70-432): Microsoft® SQL Server® 2008 - कार्यान्वयन और रखरखाव अध्याय 3: टेबल्स -> पाठ 1: टेबल्स बनाना -> पृष्ठ 66


7
इसके लिए उस आँकड़े +1 को दिखाने के लिए धन्यवाद, datetime2कमाल है (विजेता)
पंकज पारकर

2
@ इमन अबीदी: 10 सितंबर, 2014 की ऑस्कर बर्गग्रेन की टिप्पणी के अनुसार "SQLHINTS- DateTime Vs DateTime2" लेख पर आपने जो संदर्भ दिया था: "datetime2 (3) डेटाइम के समान नहीं है। उनकी संख्या समान होगी। अंकों की, लेकिन डेटाइम की सटीकता 3.33ms है, जबकि डेटाइम 2 (3) की सटीकता 1ms है। "
टॉम

1
@ पंकजपारकर: वाह, इतनी जल्दी नहीं। आप नीचे मेरे उत्तर दिनांक 7/10/17 के विपक्ष अनुभाग को देखना चाह सकते हैं।
टॉम

कैसे datetime2कम संग्रहण स्थान का उपयोग करता है datetimeऔर अभी तक एक बड़ी रेंज और उच्च परिशुद्धता प्रदान करता है?
दाई

106

मैं @marc_s और @Adam_Poward के साथ सम्‍मिलित हूं - DateTime2 आगे बढ़ने का पसंदीदा तरीका है। इसमें तिथियों की एक विस्तृत श्रृंखला है, उच्च परिशुद्धता है, और समान या कम भंडारण (परिशुद्धता के आधार पर) का उपयोग करता है।

एक बात पर चर्चा छूट गई, हालांकि ...
@Marc_s बताता है Both types map to System.DateTime in .NET - no difference there:। यह सही है, हालांकि, उलटा सच नहीं है ... और यह तब मायने रखता है जब तारीख सीमा खोजें (जैसे "मुझे 5/5/2010 पर संशोधित सभी रिकॉर्ड मिलें")।

.NET के संस्करण Datetimeमें समान रेंज और सटीक है DateTime2Datetimeपुराने एसक्यूएल के लिए एक .net नीचे मानचित्रण जब DateTimeएक निहित गोलाई होती है । पुरानी SQL DateTime3 मिलीसेकंड के लिए सटीक है। इसका मतलब है कि 11:59:59.997आप दिन के अंत तक जितना करीब हो सकते हैं। उच्चतर कुछ भी अगले दिन तक होता है।

इसे इस्तेमाल करे :

declare @d1 datetime   = '5/5/2010 23:59:59.999'
declare @d2 datetime2  = '5/5/2010 23:59:59.999'
declare @d3 datetime   = '5/5/2010 23:59:59.997'
select @d1 as 'IAmMay6BecauseOfRounding', @d2 'May5', @d3 'StillMay5Because2msEarlier'

इस निहित गोलाई से बचना DateTime2 पर जाने का एक महत्वपूर्ण कारण है। स्पष्ट रूप से तारीखों का गोल चक्कर भ्रम का कारण बनता है:


13
आप किसी भी तरह एक दिन के "अंत" को खोजने की कोशिश न करके भी इस गोलाई से बच सकते हैं। > = 5 मई और <मई 6 अधिक सुरक्षित है और किसी भी तारीख / समय प्रकार (पाठ्यक्रम के समय को छोड़कर) पर काम करेगा। इसके अलावा मी / डी / yyyy जैसे क्षेत्रीय, अस्पष्ट स्वरूपों से बचने का सुझाव दें।
हारून बर्ट्रेंड

2
@AaronBertrand - पूरी तरह से सहमत हैं, लेकिन हमारे पास जितने सवाल हैं, उन्हें देखते हुए यह मामला बताने लायक है।
19

1
आप से क्यों स्विच 20100505किया 5/5/2010? पूर्व प्रारूप SQL सर्वर में किसी भी क्षेत्र के साथ काम करेगा। उत्तरार्द्ध टूट जाएगा: SET LANGUAGE French; SELECT Convert(datetime, '1/7/2015')उफ़:2015-07-01 00:00:00.000
ErikE

1
@EBarr: पुनः। "DateTime2 आगे बढ़ने का पसंदीदा तरीका है। इसमें तिथियों की एक विस्तृत श्रृंखला, उच्च परिशुद्धता है, और समान या कम भंडारण (सटीक के आधार पर) का उपयोग करता है: मैं दृढ़ता से असहमत हूं। मेरे उत्तर के विपक्ष अनुभाग को देखें 7/10/17 नीचे। संक्षेप में, उन लाभों की संभावना नहीं है (इंजीनियरिंग / वैज्ञानिक ऐप्स के बाहर) और इसलिए उन लाभों के नुकसान के लायक नहीं है जिनकी अधिक संभावना है, बहुत आसान (यहां तक ​​कि वर्कअराउंड पर विचार करने की क्षमता) निहित / स्पष्ट रूप से एक फ्लोटिंग-पॉइंट न्यूमेरिक में कन्वर्ट करने के लिए ( # दिनों का झुकाव। यदि appl।, मिनट की तारीख के बाद से अंश) +, - और औसत के लिए मान।
टॉम

20

लगभग सभी उत्तर और टिप्पणियाँ पेशेवरों और विपक्ष पर प्रकाश में भारी पड़े हैं। यहाँ सभी पेशेवरों और विपक्ष का एक संक्षिप्त विवरण है और साथ ही कुछ महत्वपूर्ण विपक्ष (नीचे # 2 में) मैंने केवल एक बार उल्लेख किया है या बिल्कुल भी नहीं देखा है।

  1. पेशेवरों:

1.1। अधिक आईएसओ अनुरूप (आईएसओ 8601) (हालांकि मुझे नहीं पता कि यह व्यवहार में कैसे आता है)।

1.2। अधिक रेंज (1/1/0001 से 12/31/9999 बनाम 1/1 / 1753-12 / 31/9999) (हालांकि अतिरिक्त रेंज, सभी वर्ष 1753 से पहले, पूर्व के अलावा संभवतः उपयोग नहीं की जाएगी।) ऐतिहासिक, खगोलीय, भूगर्भिक, आदि क्षुधा में)।

1.3। .NET के DateTimeप्रकार की सीमा का सटीक रूप से मेल खाता है (हालांकि दोनों कोई विशेष कोडिंग के साथ आगे और पीछे परिवर्तित होते हैं यदि मान लक्ष्य प्रकार की सीमा के भीतर हैं और सटीक और नीचे त्रुटि # गोलाई के अलावा 2.1 # को छोड़कर) होगा।

1.4। अधिक सटीक (100 नैनोसेकंड उर्फ ​​0.000,000,1 सेकंड। बनाम 3.33 मिलीसेकंड उर्फ ​​0.00,,33 सेकंड।) (हालांकि अतिरिक्त परिशुद्धता का उपयोग पूर्व इंजीनियरिंग के अलावा, इंजीनियरिंग / वैज्ञानिक ऐप में नहीं किया जाएगा)।

1.5। जब समान के लिए कॉन्फ़िगर किया गया (जैसा कि 1 मिली सेकेंड में "समान" (3.33 मिलीसेक में नहीं) जैसा कि इमान अबीदी ने दावा किया है) सटीकता के रूप में DateTime, कम जगह (7 बनाम 8 बाइट्स) का उपयोग करता है, लेकिन फिर निश्चित रूप से, आप हार जाएंगे। सटीक लाभ जो संभवतः दो में से एक है (अन्य रेंज है) सबसे अधिक संभावित रूप से अनपेक्षित लाभ होने की संभावना है।

  1. कान्स:

2.1। जब एक पैरामीटर को .NET में पास किया जाता है SqlCommand, तो आपको यह निर्दिष्ट करना होगा System.Data.SqlDbType.DateTime2कि क्या आप SQL सर्वर DateTimeकी सीमा और / या परिशुद्धता के बाहर मान दे रहे हैं , क्योंकि यह चूक करता है System.Data.SqlDbType.DateTime

2.2। संख्यात्मक मानों और परिचालकों का उपयोग करते हुए SQL सर्वर अभिव्यक्तियों में निम्नलिखित के साथ / करने के लिए इसे अस्थायी रूप से / आसानी से एक फ़्लोटिंग-पॉइंट न्यूमेरिक में परिवर्तित किया जा सकता है (# दिन-तारीख के बाद से) मान।

2.2.1। # दिनों या आंशिक दिनों के जोड़ या घटाना। नोट: DateAddवर्कअराउंड के रूप में फ़ंक्शन का उपयोग करना तुच्छ नहीं है, जब आपको तिथि-समय के सभी भागों में नहीं तो कई पर विचार करने की आवश्यकता होती है।

2.2.2। "आयु" गणना के उद्देश्यों के लिए दो तारीखों के बीच का अंतर लें। नोट: आप DateDiffइसके बजाय केवल SQL सर्वर के फ़ंक्शन का उपयोग नहीं कर सकते , क्योंकि यह गणना नहीं करता है क्योंकि ageअधिकांश लोग इस बात की उम्मीद करेंगे कि यदि दो तारीख-बार एक कैलेंडर / घड़ी की तारीख-समय सीमा को पार करने के लिए होता है, तो निर्दिष्ट इकाइयों की सीमा यदि एक छोटे से अंश के लिए भी हो कि इकाई की है, यह अंतर यह है कि यूनिट के रूप में 1 बनाम 0. उदाहरण के लिए वापस लौटा देंगे, DateDiffमें Day'दो तिथि-समय की है केवल 1 मिलीसेकंड अलग 1 बनाम 0 (दिन) वापस आ जाएगी अगर उन तिथि-समय कर रहे हैं अलग-अलग कैलेंडर दिनों (अर्थात "1999-12-31 23: 59: 59.9999999" और "2000-01-01 00: 00: 00.0000000")। वही 1 मिलीसेकंड अंतर तिथि-समय यदि स्थानांतरित किया गया है ताकि वे एक कैलेंडर दिन को पार न करें, "डेटडिफ़" वापस कर देंगेDay 0 (दिनों) के ।

2.2.3। ले Avgबस को फिर से वापस "फ्लोट" में परिवर्तित करने के पहले और उसके बाद से तिथि-समय (एक सकल क्वेरी में) की DateTime

नोट: DateTime2किसी संख्यात्मक में कनवर्ट करने के लिए, आपको निम्न सूत्र जैसा कुछ करना होगा जो अभी भी मान लेता है कि आपके मूल्य वर्ष 1970 से कम नहीं हैं (जिसका अर्थ है कि आप सभी अतिरिक्त रेंज प्लस 217 वर्ष खो रहे हैं। नोट: आप कर सकते हैं। अतिरिक्त सीमा के लिए अनुमति देने के लिए केवल सूत्र को समायोजित करने में सक्षम नहीं हो सकते क्योंकि आप संख्यात्मक अतिप्रवाह मुद्दों में चल सकते हैं।

25567 + (DATEDIFF(SECOND, {d '1970-01-01'}, @Time) + DATEPART(nanosecond, @Time) / 1.0E + 9) / 86400.0- स्रोत: " https://siderite.dev/blog/how-to-translate-t-sql-datetime2-to.html "

बेशक, आप भी कर सकते थे Castकरने के लिए DateTimeपहली (और यदि आवश्यक हो तो फिर से वापस करने के लिए DateTime2), लेकिन आप परिशुद्धता और रेंज (पूरे साल के लिए पहले 1753) के लाभों को खो देंगे DateTime2बनाम DateTimeजो prolly 2 सबसे बड़ी है और यह भी एक ही समय में prolly हैं 2 कम से कम संभावना की जरूरत है जो सवाल पूछता है कि इसका उपयोग क्यों करें जब आप फ़्लोटिंग-पॉइंट न्यूमेरिक (# दिनों का) जोड़ / घटाव / "उम्र" (बनाम DateDiff) / के लिए निहित / आसान रूपांतरण खो देते हैंAvg बछड़े लाभ जो एक बड़ा है मेरे अनुभव में।

Btw, Avgतारीख का समय एक महत्वपूर्ण उपयोग के मामले में (या कम से कम होना चाहिए) है। क) तिथि-समय (एक सामान्य आधार तिथि के बाद से) औसत अवधि प्राप्त करने में उपयोग के अलावा, अवधि (एक सामान्य अभ्यास) का प्रतिनिधित्व करने के लिए उपयोग किया जाता है, ख) यह औसत तिथि क्या है, इस पर डैशबोर्ड-प्रकार के आंकड़े प्राप्त करने के लिए भी उपयोगी है। समय सीमा / पंक्तियों के समूह के दिनांक-समय के कॉलम में है। ग) एक स्तंभ में मानों की निगरानी / समस्या निवारण के लिए एक मानक (या कम से कम मानक होना चाहिए) तदर्थ क्वेरी जो कभी भी मान्य नहीं हो सकती है और / या अपवित्र होने की आवश्यकता हो सकती है, प्रत्येक मूल्य की गणना के लिए सूची बनाना है और (यदि उपलब्ध हो) Min, Avgऔर Maxउस समय से संबंधित दिनांक-टिकटों का मूल्य।


1
विरोधाभासी दृष्टिकोण की तरह - यह समीकरण के c # पक्ष को इंगित करता है। अन्य सभी "पेशेवरों" के साथ संयुक्त यह लोगों को एक अच्छा विकल्प बनाने की अनुमति देगा जहां वे अपना दर्द लेना चाहते हैं।
ईबरीयर

1
@EBarr: मेरे विपक्ष के केवल 1 भाग "" विरोधाभासी दृश्य "" समीकरण के सी # पक्ष को इंगित करता है "। बाकी (विपक्ष # है 2.2.1 - 2.2.3), जैसा कि मैंने कहा कि अधिक संभावित लाभ (की DateTime) की आवश्यकता है, सभी SQL सर्वर क्वेरी और बयान पर प्रभाव से संबंधित हैं।
टॉम

२.२.१.१ - यह तारीखों पर अंकगणित करने के लिए एक असुरक्षित अभ्यास माना जाता है, और पसंदीदा तरीका हमेशा DateAdd और संबंधित कार्यों का उपयोग करना है। यह सबसे अच्छा अभ्यास है। तारीख अंकगणित करने के लिए गंभीर दायित्व हैं, जिनमें से कम से कम यह नहीं है कि यह अधिकांश तिथि प्रकारों के लिए काम नहीं करता है। कुछ लेख: sqlservercentral.com/blogs/… sqlblog.org/2011/09/20/…
RBerman

@ ररमन: रे। "असुरक्षित": यह केवल कुछ निश्चित प्रकारों के साथ असुरक्षित है (जैसे कि DateTime2मैंने पहले ही उल्लेख किया है (अतिप्रवाह की उच्च संभावना के कारण)। पुन। "अधिकांश दिनांक प्रकारों के लिए काम नहीं करना चाहिए": आपको केवल एक के साथ काम करने की आवश्यकता है, और अधिकांश ऐप्स में अधिकांश तिथियों को संभवतः अपने पूरे जीवन काल के लिए किसी अन्य तिथि प्रकार में बदलने की आवश्यकता नहीं होगी (शायद छोड़कर, जैसे मैंने भी उल्लेख किया है , DateTime2करने के लिए DateTime(उदाहरण के लिए "तारीखों को अंकगणित" ऐसा करने के लिए, पी) यह देखते हुए कि, यह सब अतिरिक्त केवल प्रोग्राम नहीं लेकिन यह भी तदर्थ अनुसंधान प्रश्नों एक गैर गणित अनुकूल दिनांक प्रकार का उपयोग करने के लिए कोडिंग के लायक नहीं
टॉम

15

यदि आप एक एक्सेस डेवलपर हैं जो प्रश्न में फ़ील्ड में अब () लिखने की कोशिश कर रहे हैं, तो DateTime2 ने कहर बरपाया। बस एक एक्सेस किया -> SQL 2008 R2 माइग्रेशन और इसने सभी डेटाटाइम फ़ील्ड्स को DateTime2 के रूप में रखा। मूल्य के रूप में अब () के साथ एक रिकॉर्ड को लागू किया गया। यह 1/1/2012 2:53:04 PM पर ठीक था, लेकिन 1/10/2012 2:53:04 PM पर नहीं।

एक बार चरित्र ने फर्क कर दिया। आशा है कि यह किसी की मदद करता है।


15

यहाँ एक उदाहरण है जो आपको स्टोरेज साइज़ (बाइट्स) में अंतर दिखाएगा और स्मालडलटाइम, डेटाटाइम, डेटाटाइम 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 बाइट बचा सकता हूं यदि मैं डेटाइम 2 या डेटाइम 2 (7) के बजाय डेटाइम 2 (0) का उपयोग करता हूं।


10

डेटटाइम 2 के साथ सटीकता में वृद्धि होने पर , कुछ क्लाइंट डेट , समय या डेटटाइम 2 का समर्थन नहीं करते हैं और आपको एक स्ट्रिंग शाब्दिक में बदलने के लिए मजबूर करते हैं। विशेष रूप से Microsoft इन डेटा प्रकारों के साथ "डाउन लेवल" ODBC, OLE DB, JDBC और SqlClient मुद्दों का उल्लेख करता है और एक चार्ट दिखाता है कि प्रत्येक प्रकार को कैसे मैप किया जा सकता है।

यदि परिशुद्धता पर मान संगतता , डेटाटाइम का उपयोग करें


10

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

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

TLDR:

SQL 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 में बदलकर।

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

चियर्स


9

गैर-यूएस सेटिंग्स का उपयोग करते समय तिथि स्ट्रिंग की व्याख्या datetimeऔर datetime2अलग भी हो सकती है 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 मई) datetimeऔर 2013-06-05(यानी 5 जून) के लिए है datetime2। हालांकि, dateformatसेट के साथ mdy, दोनों @dऔर @d2वापस लौटें 2013-06-05

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

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


2
नहीं। आईएसओ 8601 के लिए मुझे लगता है कि आपका मतलब YYYYMMDD (कोई डैश) नहीं है। SET LANGUAGE FRENCH; DECLARE @d DATETIME = '20130605'; SELECT @d;डैश के साथ फिर से प्रयास करें।
हारून बर्ट्रेंड

1
मानक कैलेंडर तिथि अभ्यावेदन के लिए YYYY-MM-DD और YYYYMMDD दोनों प्रारूपों के लिए अनुमति देता है। मुझे लगता है कि MSDN को अधिक विशिष्ट होना चाहिए जिसके बारे में आईएसओ 8601 विनिर्देशन का सबसेट स्वतंत्र रूप से व्याख्या किया गया है!
रिचर्ड फॉसेट

1
मुझे पता है कि लेकिन SQL सर्वर में केवल नो-डैश सिंटैक्स सुरक्षित है।
आरोन बर्ट्रेंड

6

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


स्पष्ट होने के लिए, यह SQL डेटाइम के समान सटीक है, न कि .NET डेटटाइम।
सैम रुएबी

यह सही है, मैंने मान लिया कि हर कोई संदर्भ को समझेगा लेकिन इसकी कीमत विशेष रूप से बताते हुए।
jKlaus

4

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


0
Select ValidUntil + 1
from Documents

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

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

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


2
बस इसलिए हम यहां स्पष्ट हैं datetimeऔर datetime2डेटा प्रकार दोनों SQL Server 2008 में पेश किए गए थे। आप Operand type clash: date is incompatible with intउस dateप्रकार से भी प्राप्त करते हैं जो दिन डॉट के बाद से आसपास है। सभी तीन डेटा प्रकार dateadd(dd, 1, ...)यद्यपि के साथ ठीक काम करते हैं ।
ऑलवेजलीटिंग

2
यह स्पष्ट नहीं है। मेरे पास SQLServer 2005 डेटाबेस है जिसमें एक डेटाइम फ़ील्ड है।
पॉल मैकार्थी

0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.