سؤال

أتساءل لماذا SqlDateTime.MinValue ليس هو نفس التاريخ والوقت.MinValue?

هل كانت مفيدة؟

المحلول

وأعتقد أن الفرق بين SQL و .صافي تاريخ أنواع البيانات ينبع من حقيقة أن SQL Server التاريخ والوقت نوع البيانات هو الحد الأدنى والحد الأقصى للقيم و هو الدقة هي أقدم بكثير .صافي هو نوع البيانات تاريخ / وقت.

مع ظهور .صافي الفريق قررت أن نوع البيانات التاريخ والوقت يجب أن يكون أكثر الطبيعية قيمة الحد الأدنى ، 01/01/0001 يبدو إلى حد ما الخيار المنطقي ، وبالتأكيد من لغة البرمجة, بدلا من قاعدة البيانات منظور هذه القيمة هي أكثر طبيعية.

بالمناسبة, مع SQL Server 2008 ، هناك عدد من الموعد الجديد القائم على أنواع البيانات (تاريخ, الوقت, DateTime2, DateTimeOffset) هذا في الواقع لا تقدم زيادة نطاق ودقة ، عن كثب خريطة نوع البيانات تاريخ / وقت في .صافي.على سبيل المثال ، DateTime2 نوع البيانات لديها الآن مجموعة من 0001-01-01 خلال 9999-12-31.

معيار "التاريخ والوقت" نوع بيانات SQL Server دائما لديه الحد الأدنى من قيمة 01/01/1753 (بل لا يزال لديك!).يجب أن أعترف أنا أيضا كانت غريبة على أهمية هذه القيمة ، لذلك قمت ببعض البحث..ما وجدته كان على النحو التالي:

خلال الفترة بين 1 مو اليوم العالم الغربي قد تستخدم في الواقع اثنين من أهم التقاويم:التقويم اليولياني يوليوس قيصر التقويم الغريغوري من البابا غريغوري الثالث عشر.اثنين من التقاويم تختلف فيما يتعلق قاعدة واحدة فقط:حكم تحديد ما إذا كانت السنة كبيسة هو.في التقويم اليولياني ، كل سنة القسمة على أربعة هي سنة كبيسة.في التقويم الغريغوري ، كل سنة القسمة على أربعة هي سنة كبيسة ، إلا أن سنوات القسمة على 100 (ولكن لا يقبل القسمة على 400) ليست سنة كبيسة.وهكذا سنة 1700 و 1800 و 1900 هي سنة كبيسة في التقويم اليولياني ولكن ليس في التقويم الغريغوري ، في حين سنوات 1600 و 2000 سنة كبيسة في كل التقويمات.

عندما البابا غريغوري الثالث عشر عرض التقويم في 1582 ، كان موجها أيضا أن الأيام بين 4 أكتوبر 1582 ، 15 أكتوبر 1582 ، يجب أن يتم تخطي—أنه قال بعد يوم من تشرين الأول / أكتوبر-4 تشرين الأول / أكتوبر 15.العديد من البلدان تأخر تغيير على الرغم من ذلك.بريطانيا ومستعمراتها لم التحول من جوليان الميلادي الحساب حتى 1752 ، حتى بالنسبة لهم ، تخطي مواعيد بين 4 سبتمبر و 14 سبتمبر 1752.بلدان أخرى تحولت في أوقات أخرى ، ولكن 1582 و 1752 هي ذات الصلة مواعيد قواعد البيانات التي نبحثها.

وهكذا اثنين تنشأ مشاكل مع موعد الحساب عند واحد تعود إلى عدة سنوات.الأول هو أن السنوات الكبيسة قبل التبديل تحسب وفقا جوليان أو الميلادي القواعد ؟ المشكلة الثانية هو متى و كيف يجب على تخطي الأيام يكون التعامل معها ؟

هذا كيف بيغ ثمانية قواعد البيانات التعامل مع هذه الأسئلة:

  • التظاهر كان هناك أي تبديل.هذا هو ما SQL القياسية يبدو أن تتطلب ، على الرغم من أن الوثيقة املعيارية هو واضح:هو فقط يقول أن التواريخ "مقيدة الطبيعية قواعد التواريخ باستخدام التقويم الغريغوري"—مهما الطبيعية "القواعد" هي.هذا هو الخيار الذي DB2 اختار.عندما يكون هناك ذريعة واحدة التقويم القواعد تطبق دائما حتى مرات عندما لم يسمع أحد من التقويم ، المصطلح التقني هو أن "proleptic" التقويم هو في القوة.لذا, فعلى سبيل المثال ، يمكن أن نقول أن DB2 يتبع proleptic التقويم الغريغوري.

  • تجنب المشكلة تماما. مايكروسوفت و Sybase تعيين الحد الأدنى من قيم التاريخ في 1 كانون الثاني / يناير 1753 بأمان في المرة الماضية أن أمريكا تحولت التقويمات.هذا هو حصين ، ولكن من وقت لآخر الشكاوى سطح هذين قواعد البيانات تفتقر إلى وظائف مفيدة أخرى قواعد البيانات لديك و SQL القياسية يتطلب.

  • اختيار 1582.هذا ما أوراكل فعل.Oracle المستخدم سوف تجد أن التاريخ-الحساب التعبير 15 أكتوبر 1582 ناقص 4 أكتوبر 1582 ينتج قيمة 1 يوم (أكتوبر 5-14 لا وجود لها) وأن تاريخ 29 فبراير 1300 صالحة (لأن جوليان السنة الكبيسة القاعدة تنطبق).لماذا أوراكل الذهاب إلى مشكلة اضافية عندما SQL القياسية لا يبدو أن تتطلب ذلك ؟ الجواب هو أن المستخدمين قد تتطلب ذلك.المؤرخون و علماء الفلك استخدام هذا النظام الهجين بدلا من proleptic التقويم الغريغوري.(وهذا هو أيضا الخيار الافتراضي أن الشمس التقطت عند تنفيذ GregorianCalendar فئة Java—على الرغم من الاسم ، GregorianCalendar هو هجين التقويم.)

هذا الاقتباس أعلاه من أخذ من الرابط التالي:

SQL ضبط الأداء:التواريخ في SQL

نصائح أخرى

ومنذ ذلك الحين، في SQL Server تاريخ الحد الأدنى التي يمكن تخزينها في حقل التاريخ والوقت (1753/1/1)، ليس مساويا لMINVALUE من نوع البيانات التاريخ والوقت. NET (0001/1/1).

1753 كان تاريخ أول المتبني التقويم الغريغوري (إنجلترا).لماذا هذا وقد تم اختيار أكثر من 01/01/0001 - فإنه مما لا شك فيه إرث من عند Sybase SQL Server مرة أخرى في 1990s.لا بد أنهم قد جعلت تصميم المقرر في وقت مبكر Microsoft SQL الفريق لم أر سببا لتغييره.

منذ انفجار .صافي و دمج في Sql Server, هناك الآن DateTime2 كائن التوافق.إذا كنت NHibernate المستخدم ، يمكنك تقديم هذا النوع في نوع تعيينات لتجنب DateTime.Min مشاكل

.صافي المواعيد تلبية التقويمات الأخرى إلى جانب الميلادي واحد:

  • التقويم
    • ChineseLunisolarCalendar
    • EastAsianLunisolarCalendar
    • GregorianCalendar
    • HebrewCalendar
    • HijriCalendar
    • JapaneseCalendar
    • JapaneseLunisolarCalendar
    • JulianCalendar
    • KoreanCalendar
    • KoreanLunisolarCalendar
    • PersianCalendar
    • TaiwanCalendar
    • TaiwanLunisolarCalendar
    • ThaiBuddhistCalendar
    • UmAlQuraCalendar

على JulianCalendar انفاكت قبل التواريخ DateTime.MinValue

وقررت مجموعتان مختلفتان ما يعني "الحد الأدنى" لهم فيما يتعلق التاريخ / الوقت.

وSQL يستخدم التمثيل الداخلي يختلف عن التاريخ والوقت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top