webdevqa.jp.net

SqlDateTime.MinValue!= DateTime.MinValue、なぜですか?

なぜSqlDateTime.MinValueがDateTime.MinValueと同じではないのでしょうか?

69
Dhana

SQLと.NETのDateデータ型の違いは、SQL Serverのdatetimeデータ型、最小値、最大値、およびその精度は.NETのDateTimeデータ型よりもはるかに古いです。

.NETの登場により、チームはDatetimeデータ型にもっとnatural最小値を持たせることを決定し、01/01/0001はかなり論理的な選択であり、確かにプログラミング言語ではなく、データベースの観点ではなく、この値はより自然です。

ちなみに、SQL Server 2008には、多数の新しい日付ベースのデータ型があります( DateTimeDateTime2DateTimeOffset )実際に範囲と精度が向上し、.NETのDateTimeデータ型に密接に対応しています。たとえば、DateTime2データ型の日付範囲は0001-01-01〜9999-12-31です。

SQL Serverの標準の「datetime」データ型の最小値は常に1/01/1753でした(実際にまだあります!)。私も認めざるを得ない。私もこの価値の重要性に興味があったので、掘り下げた。

西暦1年から今日までの期間に、西側世界は実際に2つのメインカレンダーを使用しました。ユリウスカエサルのユリウス暦と教皇グレゴリー13世のグレゴリオ暦です。 2つのカレンダーは、うるう年を決定するルールという1つのルールのみが異なります。ユリウス暦では、4で割り切れる年はすべてうるう年です。グレゴリオ暦では、4で割り切れる年はすべてうるう年ですが、100で割り切れる年(ただし、400で割り切れない年)はうるう年ではありません。したがって、1700年、1800年、および1900年はユリウス暦のare年ですが、グレゴリオ暦ではありません。一方、1600年および2000年は両方の暦のle年です。

教皇グレゴリー13世が1582年にカレンダーを導入したとき、彼は1582年10月4日から1582年10月15日までの日をスキップするよう指示しました。つまり、10月4日以降は10月15日しかし、乗り換えが遅れました。イングランドと彼女の植民地は1752年までジュリアンからグレゴリオ暦に切り替えなかったため、スキップされた日付は1752年9月4日から9月14日の間でした。他の国は1582年と1752年が関連する私たちが議論しているDBMS。

したがって、日付演算で何年も前に戻ると、2つの問題が発生します。 1つ目は、ユリウスまたはグレゴリオの規則に従って切り替えを計算する前のうるう年ですか? 2番目の問題は、スキップされた日をいつ、どのように処理する必要があるかです。

これが、Big Eight DBMSがこれらの質問を処理する方法です。

  • スイッチがなかったふりをします。標準文書は不明確ですが、これはSQL Standardが必要とするものです。日付は「グレゴリオ暦を使用した日付の自然な規則によって制約されている」と述べています。これは、DB2が選択したオプションです。カレンダーのことを誰も聞いていないときでも、単一のカレンダーのルールが常に適用されているふりをするとき、専門用語は「予後」カレンダーが有効であることです。そのため、たとえば、DB2は予後グレゴリオ暦に従うと言えます。

  • 問題を完全に回避してください。 MicrosoftとSybaseは、1753年1月1日に最小日付値を設定しました。これは、アメリカがカレンダーを切り替えた時刻を安全に過ぎました。これは防御できますが、これらの2つのDBMSには他のDBMSが持っている有用な機能がなく、SQL標準が必要とする苦情がときどき現れます。

  • 1582を選んでください。これがOracleのしたことです。 Oracleユーザーは、日付計算式1582年10月15日から1582年10月4日を引いた値が1日(10月5〜14日がないため)であり、1300年2月29日が有効である(ユリウス年の規則が適用されます)。 SQL Standardがそれを必要としないように見えるのに、なぜOracleは余分な問題に直面したのですか?答えは、ユーザーが必要とするかもしれないということです。歴史家と天文学者は、予言的なグレゴリオ暦の代わりにこのハイブリッドシステムを使用します。 (これは、JavaのGregorianCalendarクラスを実装するときにSunが選択したデフォルトオプションでもあります。名前にもかかわらず、GregorianCalendarはハイブリッドカレンダーです。)

次のリンクからの上記の引用:

SQLパフォーマンスチューニング:SQLの日付

129
CraigTP

SQL Serverでは、日時フィールド(1753/1/1)に格納できる最小日付は、DateTime .NETデータ型のMinValue(0001/1/1)と等しくないためです。

12

1753年は、グレゴリオ暦(イングランド)の最初の採用者の日付でした。これが01/01/0001以上に選ばれた理由については、1990年代にSQL ServerがSybaseだった時代からの遺産であることは間違いありません。彼らは早い段階で設計上の決定を下したに違いないので、Microsoft SQLチームはそれを変更する理由を見ていません。

.NETの急増とSql Serverへの統合以来、互換性のためにDateTime2オブジェクトがあります。 NHibernateユーザーの場合、 このタイプを指定できます タイプマッピングでDateTime.Min問題

.NET日付は、グレゴリオ暦以外のカレンダーにも対応しています。

  • カレンダー
    • 中国語月カレンダー
    • EastAsianLunisolarCalendar
    • グレゴリオ暦
    • ヘブライ暦
    • 暦カレンダー
    • カレンダー
    • 日本語月Lカレンダー
    • ジュリアンカレンダー
    • 韓国語カレンダー
    • 韓国語ルニソーラーカレンダー
    • ペルシャ暦
    • 台湾カレンダー
    • 台湾月輪カレンダー
    • タイ仏教カレンダー
    • UmAlQuraCalendar

JulianCalendar infactの日付はDateTime.MinValue

11
Chris S

2つの異なるグループが、日付/時刻に関して「最小」が何を意味するかを決定しました。

7
Nicholas H

SQLは、DateTimeに異なる内部表現を使用します。

5
leppie