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”,因此不是“可空的”。我用

const
  c_UnassignedDate = -693594;

对于空日期值,因为这表示不可能的日期00/00/0000。但是例如 DevExpress 使用

NullDate = -700000;
InvalidDate = NullDate + 1;

所以似乎没有一致的标准vale,你应该选择一个适合你需要的。

于 2013-02-20T16:44:38.233 回答
10

首先,您需要定义“空TDateTime值”的含义。

一个TDateTime值是一个双精度值,日期编码在整数部分,时间编码在小数部分。因此,您可以获得的最接近“空日期”的可能是0.

因此,只需测试ADate <> 0以测试日期是否为“空”。

但要注意:如果你声明一个TDateTime局部变量,那么它不一定是=0在你给它一个值之前。它可以是任何东西。当然,同样的事情也适用于integer, double, boolean, ...类型的变量

另外,我相信TDateTime带有值0的 a 编码日期 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 回答
3

Spring.Persistence.Core.Session.pasSpring Framework for Delphi ( http://www.spring4d.org ) 的单元中TSession.ExecuteScalar<T>,在结果使用值为 NULL 的情况下的方法中Default(T);

我认为,您的功能可能看起来像

function IsNull(ADate: TDateTime): Boolean;
begin
  Result := ADate = Default(TDateTime);
end;
于 2020-01-23T10:59:43.017 回答
1

使用 PDateTime 代替 TDateTime,并作为 nil 值发送。如果没有指向值的指针,则没有值。

要检查值,请使用 Assigned ptr :

MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...
于 2015-07-24T12:03:10.600 回答
1

tDateTime 对于 0 和 -1 之间的值是未定义的,这意味着 -0.5 的 tDateTime 是未定义的值,并且对于作为 NaN 的替代方法的空日期很有用。DateTimeToString 将显示 -0.5 与 +0.5 相同;

于 2016-02-03T14:44:16.803 回答