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

解決


もも  2009-08-20 18:55:01  No: 35456

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

【ケース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 19:30:41  No: 35457

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

ヘルプによると、

TDateTime 型
を表示すると、

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

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

だそうです。


igy  2009-08-20 20:04:44  No: 35458

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

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


もも  2009-08-20 21:21:22  No: 35459

igy様

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


igy  2009-08-20 21:52:07  No: 35460

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

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


もも  2009-08-20 22:23:53  No: 35461

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


HOta  2009-08-21 19:49:25  No: 35462

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加