質問

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

役に立ちましたか?

解決

SQLと.NETの Date データ型の違いは、SQL Serverの datetime データ型、最小値と最大値、および精度が事実であることに起因すると思います.NETのDateTimeデータ型よりもはるかに古い。

.NETの登場により、チームはDatetimeデータ型の最小値を自然にする必要があると判断しました。01/ 01/0001はかなり論理的な選択であり、< データベースの観点ではなく、em>プログラミング言語の方が、この値はより自然です。

ちなみに、SQL Server 2008には、いくつかの新しい日付ベースのデータ型があります(日付時刻 DateTime2 DateTimeOffset )を使用すると、実際に範囲と精度が向上し、.NETのDateTimeデータ型に密接にマッピングされます。たとえば、DateTime2データ型の日付範囲は0001-01-01〜9999-12-31です。

標準の「日付時刻」 SQL Serverのデータ型の最小値は常に01/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日の間でした。他の国は他の時期に切り替わりましたが、議論しているDBMS。

     

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

     

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

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

  •   
  • 問題を完全に回避します。 MicrosoftとSybaseは、1753年1月1日に最小日付値を設定しました。これは、アメリカがカレンダーを切り替えた時刻を安全に過ぎました。これは防御可能です

他のヒント

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

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

.NETの急増とSql Serverへの統合以来、 DateTime2 オブジェクト。 NHibernateユーザーの場合、タイプマッピングでこのタイプを指定すると、 DateTime.Min の問題を回避できます

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

  • カレンダー
    • ChineseLunisolarCalendar
    • EastAsianLunisolarCalendar
    • グレゴリオ暦
    • ヘブライカレンダー
    • HijriCalendar
    • 日本語カレンダー
    • 日本語のLunisolarCalendar
    • JulianCalendar
    • KoreanCalendar
    • KoreanLunisolarCalendar
    • ペルシャ暦
    • TaiwanCalendar
    • TaiwanLunisolarCalendar
    • ThaiBuddhistCalendar
    • UmAlQuraCalendar

JulianCalendarの実際の日付より前の DateTime.MinValue

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top