似乎无法将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
值是否危险?(作为以前用途的可用资源)
正如Andreas所写,TDateTime
类型实际上是double
,因此不"可为null"。我使用
const
c_UnassignedDate = -693594;
因为这表示CCD_ 5的不可能的日期。但例如DevExpress使用
NullDate = -700000;
InvalidDate = NullDate + 1;
因此,似乎没有达成一致的标准值,你应该选择一个适合你需要的。
首先需要定义"空TDateTime
值"的含义。
TDateTime
值是以整数部分编码的日期和以小数部分编码的时间的双精度。因此,最接近"空日期"的可能是0
。
因此,只需测试ADate <> 0
即可测试日期是否为"null"。
但要注意:如果您声明了一个TDateTime
局部变量,那么在给它赋值之前,它不一定是=0
。它可以是任何东西。当然,同样的情况也适用于integer
、double
、boolean
等类型的变量。。。
此外,我相信值为0
的TDateTime
编码日期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对"未分配日期"值给出了几个更合理的选择。
在库Spring Framework for Delphi的Spring.Persistence.Core.Session.pas
单元(http://www.spring4d.org)在方法TSession.ExecuteScalar<T>
中,在结果使用值Default(T);
为NULL的情况下
我想,你的功能可以看起来像
function IsNull(ADate: TDateTime): Boolean;
begin
Result := ADate = Default(TDateTime);
end;
tDateTime对于0和-1之间的值是未定义的,这意味着-0.5的tDateTime是一个未定义的值,对于作为NaN的替代项的空日期非常有用。DateTimeToString将显示-0.5,与+0.5相同;
使用PDateTime而不是TDateTime,并作为nil值发送。如果没有指向值的指针,则结果没有值。
要检查值,请使用Assigned ptr:
MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...