18

NULL(変数に「割り当てられていない値」 )を割り当てる方法はないようです。TDateTime

私が想像した唯一の方法は、次のようなものを使用することです。

function isNull(aDate : TDateTime) : boolean;
const NullDate = 0.0;
var aNullDate : TDatetime;
    ms : Int64;
begin
  aNullDate := NullDate;
  ms := MilliSecondsBetween(aDate,aNullDate);
  result := (ms = Int64(0));
end;

0の日付値と重ならないより良い解決策を知っている人はいますか?

負のTDateTime値は危険ですか?(以前の目的のための有能なリソースとして)

4

5 に答える 5

18

Andreasがすでに書いたように、TDateTime型は実際にdoubleは「null許容」ではありません。私が使う

const
  c_UnassignedDate = -693594;

空の日付値の場合、これはの不可能な日付を表します00/00/0000。しかし、例えば、DevExpressは

NullDate = -700000;
InvalidDate = NullDate + 1;

したがって、合意された標準の値はないようです。ニーズに合った値を選択する必要があります。

于 2013-02-20T16:44:38.233 に答える
10

TDateTime最初に、「空の値」の意味を定義する必要があります。

TDateTime値は、整数部分にエンコードされた日付と小数部分にエンコードされた時刻を持つ double です。したがって、取得できる「null 日付」に最も近いものは、おそらく0.

したがって、ADate <> 0日付が「null」かどうかをテストするだけです。

ただし、注意してください:TDateTimeローカル変数を宣言する=0場合、値を与える前に宣言するとは限りません。それは何でもかまいません。もちろん、同じことがintegerdoubleboolean、 ...型の変数にも当てはまります。

また、TDateTimewith 値0は日付 1899-12-30 をエンコードすると思います。

最後に、負のTDateTime値は完全に正常です。たとえば、 に-5000対応し1886-04-22ます。

あなたのコードの要点がよくわかりません。「割り当てられていない」値として使用したい場合0(1899-12-30 に近い日付に関心がある場合はこれは不適切です)、単純に次のようにしないでください。

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := ADate = 0;
end;

または、おそらく(ただし、同等ではありません!)、

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := IsZero(Date);
end;

彼の答えでは、ain は「割り当てられていない日付」の値に対してより合理的な選択肢をいくつか与えました。

于 2013-02-20T16:35:26.237 に答える
1

tDateTime は 0 ~ -1 の値に対して未定義です。つまり、-0.5 の tDateTime は未定義の値であり、NaN の代替として null 日付に役立ちます。DateTimeToString は、+0.5 と同じように -0.5 を表示します。

于 2016-02-03T14:44:16.803 に答える