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

SqlDateTime.MinValue!=DateTime.MinValue, क्यों?

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

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

संयोग से, SQL सर्वर 2008 के साथ, कई नए दिनांक-आधारित डेटाटाइप (दिनांक, समय, दिनांक समय2, दिनांक समय ऑफसेट) हैं जो वास्तव में एक बढ़ी हुई सीमा और सटीकता प्रदान करते हैं, और .NET में दिनांक समय डेटाटाइप को बारीकी से मैप करते हैं। उदाहरण के लिए, डेटटाइम2 डेटा प्रकार की दिनांक सीमा 0001-01-01 से 9999-12-31 तक होती है।

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

<ब्लॉकक्वॉट>

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

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

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

इस तरह बिग आठ डीबीएमएस इन सवालों को संभालते हैं:

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

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

  • 1582 चुनें। ओरेकल ने यही किया। एक Oracle उपयोगकर्ता को पता चलेगा कि दिनांक-अंकगणितीय व्यंजक 15 अक्टूबर 1582 घटा 4 अक्टूबर 1582 1 दिन का मान देता है (क्योंकि 5-14 अक्टूबर मौजूद नहीं है) और यह कि दिनांक 29 फरवरी 1300 मान्य है (क्योंकि जूलियन लीप- वर्ष नियम लागू होता है)। जब SQL मानक को इसकी आवश्यकता नहीं लगती है तो Oracle को अतिरिक्त परेशानी क्यों हुई? इसका उत्तर यह है कि उपयोगकर्ताओं को इसकी आवश्यकता हो सकती है। इतिहासकार और खगोलविद प्रोलेप्टिक ग्रेगोरियन कैलेंडर के बजाय इस संकर प्रणाली का उपयोग करते हैं। (यह भी डिफ़ॉल्ट विकल्प है जिसे सूर्य ने जावा के लिए ग्रेगोरियन कैलेंडर क्लास को लागू करते समय चुना था—नाम के बावजूद, ग्रेगोरियन कैलेंडर एक हाइब्रिड कैलेंडर है।)

यह उपरोक्त उद्धरण निम्न लिंक से लिया गया है:

SQL प्रदर्शन ट्यूनिंग:SQL में दिनांक



  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. सी # में संग्रहीत प्रक्रिया आउटपुट पैरामीटर का उपयोग करना

  3. SQL सर्वर लेनदेन लॉग, भाग 2:लॉग आर्किटेक्चर

  4. SQL सर्वर 2000 - लिंक्ड सर्वर

  5. रिकर्सिव सेल्फ-जॉइन करने का सबसे आसान तरीका?