SQLServerにDatetime型のデータがあって、初期値をとりあえずDatetime.MaxValueにしてみたらハマりました。

やりたかったのは以下のこと。

  1. .netで生成したDatetime.MaxVlueをSQLServerに登録
  2. SQLServerから登録したデータを取得
  3. 取得したデータを再度Datetime.MaxValueで比較
  4. 一致してれば初期値だね!

.netとSQLServerではDatetime型は最大値と最小値が違う

結論としてはこの比較はNGです。
なんでかというと、.netとSQLServerではDatetime型という同じ名前のくせに最大値と最小値の中身がちょっと違うのです。

Min DateMax Date
.Net0001-01-01 00:00:00.0009999-12-31 23:59:59.999
SQL Server1753-01-01 00:00:00.0009999-12-31 23:59:59.997

つまりは、.netで生成されたMaxValue「9999-12-31 23:59:59.999」を登録しても、SQLServerでは最大値が「9999-12-31 23:59:59.997」までなので「9999-12-31 23:59:59.997」で登録されるというわけですな。
これを検索して再度比較しても別物ですよ、と。

最小値があからさまに違うのはわかっていたので最大値にしたのですが、最大値も.002秒違うという。
MSさんなんでや。

[ad#res02]

単純に日時だけ比較したい場合

今回は単純に日時の比較だけしたかったので、少し雑ですけど.ToString()で細かい値は切り捨てて比較してやりました。
デバッグでブレイクして値を見ても、まったく同じなのに比較するとfalseになるというマジック。

今後は気をつけていこうと思います。

下記を参考にさせてもらいました。

いつもシェアありがとうございます!気に入ったらシェアしていただけたら幸いです。