2009-04-30 9 views

उत्तर

128

मैं एसक्यूएल की और नेट के दिनांक डेटा प्रकार के बीच अंतर यह है कि SQL सर्वर के datetime डेटा प्रकार, यह न्यूनतम और अधिकतम मूल्य है की वजह से उपजी लगता है, और यह सटीक है नेट की दिनांक समय डेटाप्रकार की तुलना में बहुत पुराने हैं।

नेट के आगमन के साथ

, टीम ने निर्णय लिया कि Datetime डेटा प्रकार एक और अधिक प्राकृतिक न्यूनतम मान होना चाहिए, और 01/01/0001 एक काफी तार्किक विकल्प लगता है, और निश्चित रूप से एक प्रोग्रामिंग भाषा से, डेटाबेस परिप्रेक्ष्य के बजाय, यह मान अधिक प्राकृतिक है।

संयोग से, एसक्यूएल सर्वर 2008 के साथ, वहाँ नई तिथि के आधार पर डेटाटाइप्स के एक नंबर रहे हैं (Date, Time, DateTime2, DateTimeOffset) वास्तव में है कि एक वृद्धि की सीमा और परिशुद्धता प्रदान करते हैं, और बारीकी से नेट में datetime डेटाप्रकार के लिए नक्शे । उदाहरण के लिए, दिनांक समय 2 डेटा प्रकार की तिथि 0001-01-01 से 99 99-12-31 तक है।

SQL सर्वर के मानक "डेटाटाइम" डेटा प्रकार का हमेशा न्यूनतम मूल्य 01/01/1753 (और वास्तव में अभी भी है!) है। मैं मानता चाहिए, मैं भी यह मान के महत्व को जानने के लिए उत्सुक था, इसलिए कुछ खुदाई किया था .. क्या मैंने पाया इस प्रकार था:

1 ई और आज के बीच की अवधि के दौरान, पश्चिमी दुनिया वास्तव में इस्तेमाल किया गया है दो मुख्य कैलेंडर: जूलियस सीज़र के जूलियन कैलेंडर और पोप ग्रेगरी XIII के ग्रेगोरियन कैलेंडर। दो कैलेंडर केवल एक नियम के संबंध में भिन्न होते हैं: निर्णय लेने का नियम कि लीप वर्ष क्या है। जूलियन कैलेंडर में, चार साल से विभाजित सभी साल छलांग वर्ष हैं। ग्रेगोरियन कैलेंडर में, चार साल से विभाजित सभी वर्ष छलांग वर्ष हैं, सिवाय इसके कि साल 100 से विभाजित हैं (लेकिन 400 से विभाजित नहीं) लीप साल नहीं हैं। इस प्रकार, 1700, 1800 और 1 9 00 साल जूलियन कैलेंडर में लीप साल हैं, लेकिन ग्रेगोरियन कैलेंडर में नहीं, जबकि 1600 और 2000 साल दोनों कैलेंडर में लीप साल हैं।

जब पोप ग्रेगरी XIII ने 1582 में अपना कैलेंडर पेश किया, तो उन्होंने यह भी निर्देश दिया कि 4 अक्टूबर, 1582 और 15 अक्टूबर, 1582 के बीच के दिनों को छोड़ दिया जाना चाहिए- यानी, 4 अक्टूबर के बाद का दिन अक्टूबर होना चाहिए 15. हालांकि, कई देशों में बदलाव में देरी हुई। 1752 तक इंग्लैंड और उसके उपनिवेशों ने जूलियन से ग्रेगोरियन गणना पर स्विच नहीं किया था, इसलिए उनके लिए, छोड़ी गई तिथियां 4 सितंबर और 14 सितंबर, 1752 के बीच थीं। अन्य देश अन्य समय पर स्विच किए गए, लेकिन 1582 और 1752 के लिए प्रासंगिक तिथियां हैं डीबीएमएस जिन पर हम चर्चा कर रहे हैं।

इस प्रकार, कई समस्याएं अंकगणित के साथ उत्पन्न होती हैं जब कोई कई वर्षों तक वापस जाता है। सबसे पहले, जूलियन या ग्रेगोरियन नियमों के अनुसार स्विच की गणना करने से पहले वर्षों को छलांग लगाना चाहिए? दूसरी समस्या यह है कि छोड़े गए दिन कब और कैसे संभाले जाएंगे?

  • मान लें कि कोई स्विच नहीं थी:

    यह कैसे बिग आठ DBMSs इन सवालों को संभालने है। एसक्यूएल मानक की आवश्यकता होती है, हालांकि मानक दस्तावेज अस्पष्ट है: यह सिर्फ कहता है कि तिथियां "ग्रेगोरियन कैलेंडर का उपयोग करके तारीखों के प्राकृतिक नियमों से बाधित हैं" - जो भी "प्राकृतिक नियम" हैं। यह विकल्प है कि डीबी 2 ने चुना। जब कोई झगड़ा होता है कि कैलेंडर के नियमों को कभी भी लागू नहीं किया जाता है, तब भी जब कोई कैलेंडर के बारे में नहीं सुना जाता है, तकनीकी शब्द यह है कि "सर्वव्यापी" कैलेंडर लागू होता है। तो, उदाहरण के लिए, हम कह सकते हैं कि डीबी 2 एक प्रख्यात ग्रेगोरियन कैलेंडर का पालन करता है।

  • पूरी तरह से समस्या से बचें। माइक्रोसॉफ्ट और साइबेस ने 1 जनवरी, 1753 को अपने न्यूनतम दिनांक मूल्यों को सेट किया, जो सुरक्षित रूप से अमेरिका ने कैलेंडरों को स्विच किया था। यह बचाव योग्य है, लेकिन समय-समय पर शिकायतें सतह से इन दो डीबीएमएस में उपयोगी कार्यक्षमता की कमी है जो अन्य डीबीएमएस के पास है और एसक्यूएल मानक की आवश्यकता है।

  • 1582 उठाएं। ओरेकल ने यही किया। एक ओरेकल उपयोगकर्ता को पता चलेगा कि दिनांक-अंकगणितीय अभिव्यक्ति अक्टूबर 15 1582 शून्य 4 अक्टूबर 1582 से 1 दिन का मूल्य उत्पन्न करती है (क्योंकि अक्टूबर 5-14 अक्टूबर मौजूद नहीं है) और फरवरी 2 9 1300 की तारीख वैध है (क्योंकि जूलियन लीप- वर्ष नियम लागू होता है)। जब SQL मानक को इसकी आवश्यकता नहीं होती है तो ओरेकल अतिरिक्त परेशानी क्यों जाती है? जवाब यह है कि उपयोगकर्ताओं को इसकी आवश्यकता हो सकती है। इतिहासकार और खगोलविद एक प्रख्यात ग्रेगोरियन कैलेंडर की बजाय इस संकर प्रणाली का उपयोग करते हैं।

    : यह ऊपर उद्धरण नीचे दिए गए लिंक से लिया से (यह भी डिफ़ॉल्ट विकल्प सूर्य उठाया है कि जब के लिए जावा के बावजूद नाम, ग्रेगोरी कैलेंडर एक संकर कैलेंडर है ग्रेगोरी कैलेंडर वर्ग को लागू है।)

SQL Performance Tuning: Dates in SQL

+1

i18n से, सभी SQL सर्वर डेटाटाइम मानों पर हमेशा ग्रेगोरियन होने पर भरोसा न करें। 20 वीं शताब्दी में रूस और चीन (और अन्य ई। यूरोपीय देशों) जूलियन से ग्रेगोरियन कैलेंडर में बदल गए। – Richard

+0

@ रिचर्ड - सहमत। इन चीजों को पहले बड़े पैमाने पर चेक किया जाना चाहिए। पूरी दुनिया में जूलियन से ग्रेगोरियन तक स्विच करने का पूरा व्यवसाय इतिहास में एक ग़लत अवधि था और मुझे संदेह है कि हर मामले में निश्चित नियमों का एक सेट हमेशा लागू किया जा सकता है। – CraigTP

+1

मुझे आश्चर्य है कि 1 9वीं शताब्दी से पहले या यहां तक ​​कि 1 9 60 के दशक से पहले की तारीखों का उपयोग करने के लिए ऐप्स को क्या उपयोग करना होगा? लेकिन फिर पुरातात्विकों को सीमित करता है जो 1753 तक SQL सर्वर का उपयोग करते हैं, या ओरेकल के साथ 1582। –

7

दो अलग-अलग समूहों ने तय किया कि दिनांक/समय के संबंध में उनके लिए "न्यूनतम" क्या अर्थ है।

+1

मुझे लगता है कि, कि इस सटीक जवाब है। (कोई विडंबना नहीं) – nothrow

+0

हाँ, मुझे लगता है कि यह भी ऐसा है। – Phil

+1

दोस्त अगर आप इसे कम कर देते हैं क्योंकि आपने एक गूंगा जवाब दिया है ... "क्योंकि मैंने ऐसा कहा था" जब कोई व्यक्ति 10 साल से अधिक उम्र में पूछता है (और मैं वहां उदार हूं) तो जवाब के रूप में नहीं गिना जाता है। लेकिन मैंने आपको कम नहीं किया :-) –

5

एसक्यूएल डेटटाइम के लिए एक अलग आंतरिक प्रतिनिधित्व का उपयोग करता है।

+5

ओपी के सवाल के लिए यह सहायक कैसे है? – ANeves

+1

@ एनेव्स यह बहुत उपयोगी है। यह देखते हुए कि .NET और MSSQL कंप्यूटिंग विकास के 10 वर्षों से अलग हो गए हैं, तो इसका अर्थ यह होगा कि उन्हें अलग-अलग न्यूनतम तिथियां होने की संभावना नहीं होगी। – Contango

+0

@Contango यह इस तरह के कुछ भी नहीं है। वे डेटटाइम के लिए अलग-अलग आंतरिक प्रतिनिधित्व कर सकते थे, और अभी भी समान मनमाना न्यूनतम मान है (उदाहरण के लिए, संगतता उद्देश्यों के लिए, या किसी दिए गए मानक को लागू करने के लिए)। साथ ही, आंतरिक प्रतिनिधित्व के आधार पर न्यूनतम मूल्य spec में कार्यान्वयन कार्यान्वयन होगा, जो मेरी राय में एक बहुत खराब बात ™ है। – ANeves

12

चूंकि, SQL सर्वर में न्यूनतम दिनांक जो डेटाटाइम फ़ील्ड (1753/1/1) में संग्रहीत किया जा सकता है, डेटटाइम .NET डेटा प्रकार (0001/1/1) के MinValue के बराबर नहीं है।

+1

हां, यह सही जवाब है। यदि आप डेटटाइम को स्टोर करने का प्रयास करते हैं। MinValue को SQL सर्वर पर, आपको एक त्रुटि मिलती है। –

+9

मुझे बिल्कुल यकीन नहीं है कि यह ओपी के सवाल का जवाब कैसे देता है। उन्होंने पूछा कि वे एक जैसे क्यों नहीं हैं। यह जवाब बस कहता है "हाँ वे वही नहीं हैं"। क्रेग का जवाब अंतर्निहित मुद्दे पर और अधिक आगामी था। – NotMe

+0

स्वीकृत उत्तर, भले ही उसने केवल न्यूनतम मूल्यों को जोड़ा जो कि पहले से ही प्रश्न में था? वास्तव में?? कितना अजीब है। – ANeves

10

1753 ग्रेगोरियन कैलेंडर (इंग्लैंड) के पहले गोद लेने की तिथि थी। यह क्यों 01/01/0001 को चुना गया था - इसमें कोई संदेह नहीं है जब 1 99 0 के दशक में एसक्यूएल सर्वर साइबेस वापस था। उन्होंने डिजाइन डिज़ाइन को जल्दी ही बनाया होगा और माइक्रोसॉफ्ट एसक्यूएल टीम ने इसे बदलने का कोई कारण नहीं देखा है।

.NET के विस्फोट और एसक्यूएल सर्वर में इसके एकीकरण के बाद, अब DateTime2 संगतता के लिए ऑब्जेक्ट है। DateTime.Min समस्याओं

से बचने के लिए यदि आप एनएचबीर्नेट उपयोगकर्ता हैं, you can provide this type अपने प्रकार के मैपिंग में हैं।नेट तिथियां ग्रेगोरियन एक के अलावा अन्य कैलेंडर के लिए पूरा:

  • Calendar
    • ChineseLunisolarCalendar
    • EastAsianLunisolarCalendar
    • ग्रेगोरी कैलेंडर
    • HebrewCalendar
    • HijriCalendar
    • JapaneseCalendar
    • JapaneseLunisolarCalendar
    • JulianCalendar
    • KoreanCalendar
    • KoreanLunisolarCalendar
    • PersianCalendar
    • TaiwanCalendar
    • TaiwanLunisolarCalendar
    • ThaiBuddhistCalendar
    • UmAlQuraCalendar

JulianCalendar वास्तव में पूर्व तिथियों DateTime.MinValue

+0

हमम आपने कुछ अन्य प्रश्नों का उत्तर दिया।सवाल "क्यों" है, नहीं, "मैं इसके आसपास कैसे काम करूं" –

+0

@gmagana अच्छा बिंदु, समय वापस लाएं! –

संबंधित मुद्दे