日付の計算

解決


マキ  2002-11-22 23:59:58  No: 2178

こんにちは。
初歩的な質問なのかもしれませんが、宜しくお願いします。

VBでは、日付の計算はこんな感じで行えると思うのですが
この用に、日付の計算をDelphiで行うには、どんな関数があるのですか?
If IsNull(Day1) OR IsNull(Day2) Then
   Text1.Value = ""
Else
   Text1.Value = ("d", Day2, Day1)
End if

宜しくお願いします。


にしの  2002-11-23 00:25:58  No: 2179

VBでも、計算するときは関数が必要だったと思います。
# DateDiffでしたっけ?

Delphiの日付は、Double型です。
妙な管理方法でして、整数部が日付、小数部が時刻を表します。
あとは普通に計算できます。
つまり、
day3 := day2 - day1;
という具合にです。

日付を文字列に変換するなど、細かいところはヘルプを見てください。
「日付時刻ルーチン」にあります。


マキ  2002-11-23 01:41:26  No: 2180

にしのさん。いつもありがとうございます。

If IsNull(Day1) OR IsNull(Day2) Then
   Text1.Value = ""
Else
   Text1.Value = DateDiff("d", Day2, Day1)
End if
すいません。DateDiff書き忘れてました。

日付時刻ルーチンに、DaysBetween 関数というのが
あったので、たぶんこれじゃないかな?と思っていますが、
使い方が良くわかりません。

ヘルプに例とかないし、いまいち使い方が解りません。
それと、Nullはどうやって、判断するのですか?

もし、よろしかったら、そこも教えてください。
宜しくお願いします。


にしの  2002-11-23 02:18:23  No: 2181

TDateTimeにはNullはあり得ません。
もしかして、Day1などの変数はTDateTime(もしくはTDate,TTime)でなく、Variant型ですか?

Delphi5にはDaysBetweenがありませんでした。Delphi6から追加のようです。

2つの日付から日数を得るのは、単純な四則演算で出来ます。
たとえば、
var
  day1, day2, day3: TDate;
begin
  day1 := StrToDate('2002/11/23');
  day2 := StrToDate('2003/11/23');
  day3 := day2 - day1;
  ShowMessage(Format('%.1f', [day3]));
とすれば、365.0と表示されます。

Delphi6で日付の管理方法が変わっていたら違う結果になるかもしれません。


にしの  2002-11-23 02:19:29  No: 2182

NULLかどうかは、上にも書いたとおり判断できません。
TDateTimeは、double型と同じですから。
Variantであれば、VarIsNull関数で調べられます。


マキ  2002-11-23 02:35:32  No: 2183

ありがとうございます。

日付の計算は
var
  day1, day2, day3: TDate;
begin
  day1 := StrToDate('2002/11/23');
  day2 := StrToDate('2003/11/23');
  day3 := day2 - day1;
  ShowMessage(Format('%.1f', [day3]));
とすれば、365.0と表示されます。
で、うまくいきました。

>もしかして、Day1などの変数はTDateTime(もしくはTDate,TTime)でなく、>Variant型ですか?

Day1等は、テーブルのフィールドです。(Date型)
データが、何も入っていない時計算すると、落ちてしまいます。
これを、回避するには、どうすれば良いんですか?

宜しくお願いいたします。


にしの  2002-11-23 02:56:39  No: 2184

SQLでのDATE型というと、DelphiではTDateFieldクラスですよね。
TDateFieldクラスに限らず、TFieldクラスには、IsNullプロパティがあるので、これでチェックしてからTDate型にコピーすればOKです。


マキ  2002-11-25 19:15:30  No: 2185

にしのさん。ありがとうございました。

IsNullでうまくいきました。

それと、基本的なことで恥ずかしいんですが、
VBだと
if IsNull(day1) = False And IsNull(day2) = False then
   MsgBox "値があります。"
End if
とできるのですが、

Delphiだと、
if クエリー項目Day1.IsNull = False then
   Begin
      if クエリー項目Day2.IsNull = False then
         ShowMessage('値があります。')
       else
         ShowMessage('値がありません。');
   End;

とやらないと、うまくいってくれません。
これは、何故なのですか?

それと、elseの処理に入ると、EVariantErrorクラスなんちゃらというのが出て
処理が止まってしまいます。

もしよろしければ、教えていただけますでしょうか?


にしの  2002-11-25 19:44:46  No: 2186

ヘルプの、Object Pascal言語ガイドで、「優先順位」を調べてみてください。
=より、Andのほうが優先度が高いです。
つまり、
If クエリー項目Day1.IsNull = False And クエリー項目Day2.IsNull = False then
は、
If (クエリー項目Day1.IsNull = (False And クエリー項目Day2.IsNull)) = False then
として処理され、結果的に
If クエリー項目Day1.IsNull = True then
として処理されます


マキ  2002-11-25 23:07:32  No: 2187

ありがとうございました。

うまくいきました。

今後とも宜しくお願いします。
m(_ _)m  マキ。


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








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