似乎无法将 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
值是否危险? (作为以前用途的能力资源)
答案 0 :(得分:14)
正如Andreas所写,TDateTime
类型实际上是double
,因此不是“可空”。我用
const
c_UnassignedDate = -693594;
表示空日期值,因为这表示00/00/0000
的不可能日期。但是例如DevExpress使用
NullDate = -700000;
InvalidDate = NullDate + 1;
所以似乎没有商定标准的谷,你应该选择一个符合你需要的谷。
答案 1 :(得分:9)
首先,您需要通过'空TDateTime
值来定义您的意思。
TDateTime
值是一个double,其中日期在整数部分中编码,时间在小数部分中编码。因此,最接近'null date'的东西可能是0
。
因此,只需测试ADate <> 0
以测试日期是否为“空”。
但要注意:如果你声明一个TDateTime
局部变量,那么在你给它一个值之前它不一定是=0
。它可以是任何东西。当然,同样的事情适用于integer
,double
,boolean
,......的变量......
另外,我认为值为TDateTime
的{{1}}对日期1899-12-30进行编码。
最后,负0
值完全正常。例如,TDateTime
对应-5000
。
我不太明白你的代码。如果您想使用1886-04-22
作为'未分配'值(如果您对接近1899-12-30的日期感兴趣,那么为什么不做呢)
0
或者,可能(但不等同!),
function IsUnassigned(ADate: TDateTime): boolean;
begin
result := ADate = 0;
end;
在他的回答中,ain为“未分配日期”值提供了几个更合理的选择。
答案 2 :(得分:1)
使用PDateTime代替TDateTime,并以nil值发送。如果没有指向value的指针,则结果没有值。
要检查值,请使用Assigned ptr:
MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...
答案 3 :(得分:1)
答案 4 :(得分:1)
在方法{{1}中的库 Spring Framework for Delphi (http://www.spring4d.org)的单元Spring.Persistence.Core.Session.pas
中,如果结果使用值TSession.ExecuteScalar<T>
为NULL
我认为,您的功能可以看起来像
Default(T);