日付項目のNull検査またはZERO検査をするには?

解決


もも  2009-08-20 09:55:01  No: 35456  IP: 192.*.*.*

いつもお世話になります。
  以下の日付項目の取り扱いで困っております。

【ケース1】
  テーブルへの書き込みをADOQuery1.Parameters.ParamByName
('_登録日').Value := Null;で書き込み、DateTimeToStr
(ADOQuery1.FieldByName('登録日').AsDateTime);で読み込むと、
結果は 1899/12/30 となります。

【ケース2】
  テーブルへの書き込みをADOQuery1.Parameters.ParamByName
('_登録日').Value := StrToDateTime('0');で書き込み、
DateTimeToStr(ADOQuery1.FieldByName('登録日') .AsDateTime);
で読み込むと、結果は 1899/12/30となります。


  ケース1は、テーブルの該当項目には何も表示されていませんので、
Null??と思いますが、どうして結果が1899/12/30なのか判りません。
ケース2も同様に結果が1899/12/30なのか判りません。

  最終的に何がしたいかといいますと、テーブルの日付項目に対して
Nullの検査またはZEROの検査をしたいのですが、どうすればよいか
判りません。

  どなたかご教授頂けますでしょうか?
  環境は、WindowsXP、Delphi2007、Access2003です。

編集 削除
igy  2009-08-20 10:30:41  No: 35457  IP: 192.*.*.*

>どうして結果が1899/12/30なのか判りません。

ヘルプによると、

TDateTime 型
を表示すると、

> ほとんどの VCL オブジェクト は TDateTime 型を使って日付値と時刻値を示します。
> TDateTime 値の整数部は西暦 1899 年 12 月 30 日からの経過日数を示します。
> TDateTime の小数部はその日の時間を示します。

> 次の表に TDateTime 値の例とそれに対応する日付と時間を示します。
> 0  1899 年 12 月 30 日 午前 12:00

だそうです。

編集 削除
igy  2009-08-20 11:04:44  No: 35458  IP: 192.*.*.*

> 最終的に何がしたいかといいますと、テーブルの日付項目に対して
> Nullの検査またはZEROの検査をしたいのですが、どうすればよいか
> 判りません。

試していませんが、
if (ADOQuery1.FieldByName('登録日').AsDateTime = 0) then
begin
    // 0 が格納?
end;
で判断は出来ますか?

編集 削除
もも  2009-08-20 12:21:22  No: 35459  IP: 192.*.*.*

igy様

  いつもお世話になります。
  『0』を格納してAccessのテーブルを見ますと、0:00:00と表示
します。
  これをDateTimeToStr(ADOQuery1.FieldByName('登録日') .AsDateTime);
で読み込むと、結果は 1899/12/30となります。
  この日付/時刻型というのは非常に扱いにくいです。
  日付はとく取り扱う項目ですが、フォームで日付の入力が無かった場合、
テーブルに対してはどのように処理されていますか?

編集 削除
igy  2009-08-20 12:52:07  No: 35460  IP: 192.*.*.*

> フォームで日付の入力が無かった場合、
> テーブルに対してはどのように処理されていますか?

私の場合、0 (すなわち 1899/12/30 )を格納してます。

編集 削除
もも  2009-08-20 13:23:53  No: 35461  IP: 192.*.*.*

ありがとうございます。
  私もそのように致します。

編集 削除
HOta  2009-08-21 10:49:25  No: 35462  IP: 192.*.*.*

nilは
ADOQuery1.FieldByName('登録日').IsNull
で検査できます。

編集 削除