C#とAccessにおける、日付型(DateTime)のデフォルト値の差について

C#Accessにて、日付型(DateTime)のデフォルト値に差があることを忘れたりするので、メモ。

起こること

C#にて、DateTime型のnull扱い(=初期値)をどうするか悩みましたが、以下のようなコードで対応することにしました。
参考:今日の井原@はてな - DateTimeにnullを代入しようとすると怒られる件

new DateTime(0);


このままデータを保存すると、Accessには「00:00:00」と表示され、問題なく登録されます。

しかし、このデータをAccessから読込み、デフォルト値(上記のDateTime(0))と比較すると、値が一致しません。



理由

Accessの日付型の仕様を見ると、以下の様な記載がありました。

日付値 0 は 1899 年 12 月 30 日を表します。

Microsoft KB210276 - Microsoft Access で日付/時刻型の値の格納、計算、および比較を行う方法


一方、.NETのDateTime構造体は以下の通りです。

DateTime 値型は、A.D. (西暦紀元) 0001 年 1 月 1 日の深夜 12:00:00 から、A.D. (西暦紀元) 9999 年 12 月 31 日の午後 11:59:59 までの間の値で日付と時刻を表します。

MSDN - DateTime 構造体


そのため、DateTime(0)とすると、.NETとAccessで日付に差が出てしまうようです。



対応

Accessに保存する日付型にデフォルト値が必要であれば、その値を明示的に入れるようにしました。


今回は、Accessが「1899/12/30 00:00:00」を「0」として扱うため、C#でも「1899/12/30 00:00:00」と入れるようにする、など。


言語やDBの型の初期値の仕様をきちんと確認してから使おう、ということで。