2013-02-20 3 views
8

scheint es keine Möglichkeit gibt NULL (entweder als „ unassigned Wert“ zu TDateTime Variablen zuweisenDelphi: Wie bestimmen und leeren TDateTime-Wert

Der einzige Weg, ich es mir vorgestellt habe, ist, verwendet wird. so etwas wie dieses:

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; 

gibt es jemand, wer bessere Lösung weiß, was Wert nicht überlappt 0 Datum

Sind neg? ative TDateTime Werte gefährlich? (Als eine fähige Ressource für früheren Zweck)

+0

Wenn Sie beabsichtigen, diese Funktion zu verwenden, war das, denke ich, sicherlich 'NullDate' sollte eine globale Konstante sein? –

+0

Ich habe Probleme beim Vergleich einer Null zugewiesenen Wert TDateTime Variable mit dem const Wert 0 erfahren. A _simple_ ** wenn ** als dieser nicht die Bedingung überprüft 'var v_datetime: TDatetime;' 'v_datetime: = 0; ' ' if (v_datetime = 0) dann actionToTake' – xsubira

+3

Das liegt an Floating-Point-Fuzz. Benutze 'Math.IsZero'. –

Antwort

9

Wie Andreas schon schrieb, ist der TDateTime Typ eigentlich double und somit nicht "nullbar". Ich benutze

const 
    c_UnassignedDate = -693594; 

für einen leeren Datumswert, da dies ein unmögliches Datum 00/00/0000 darstellt. Aber zum Beispiel DevExpress verwendet

NullDate = -700000; 
InvalidDate = NullDate + 1; 

So scheint es auf Standard-vale nicht vereinbart werden, sollten Sie eine auswählen, die Ihren Bedürfnissen entspricht.

+2

Es gibt kein Datum, an dem ** Tag ** und ** Monat ** 0 (Null) sind. Wenn in der Datenbank das Datum nicht zugewiesen ist, sollte "NULL" verwendet werden, nicht ein magisches Datum. – ain

+1

Ja, tut mir leid. Wenn ich zurückgehe, habe ich gerade auf den Jahresabschnitt dieses Datums geschaut ... Nun, wenn der Wert einer bestimmten Datumszeitspalte "NULL" ist und ich diesen Wert streng auf ein "TDateTime" -Feld speichern müsste, I würde wahrscheinlich Ihren 'c_UnassignedDate' Konstantenwert verwenden. [+1] – TLama

+0

Wie finden Sie, dass -693594 das Datum 0/0/0000 darstellt? –

9

Zuerst müssen Sie definieren, was Sie mit 'ein leerer TDateTime Wert' meinen.

Ein TDateTime Wert ist ein Double mit dem Datum im Integer-Teil codiert und die Zeit im Bruchteil codiert. Das nächste, was einem "Nulldatum" am nächsten kommt, ist wahrscheinlich 0.

Testen Sie einfach ADate <> 0, um zu testen, ob das Datum 'null' ist.

Aber Vorsicht: Wenn Sie eine TDateTime lokale Variable deklarieren, dann ist es nicht unbedingt =0 bevor Sie ihm einen Wert geben. Es kann alles sein. Natürlich gilt das gleiche, was zu Variablen vom Typ integer, double, boolean, ...

Auch ich glaube, dass ein TDateTime mit Wert 0 1899-12-30 das Datum kodiert.

Schließlich sind negative TDateTime Werte völlig normal. Zum Beispiel entspricht -50001886-04-22.

Ich verstehe nicht ganz den Punkt Ihres Codes. Wenn Sie 0 als ‚nicht zugeordnet‘ Wert verwendet werden soll (was schlecht ist, wenn Sie in zeitlicher Nähe zu 1899-12-30 interessiert sind), warum nicht einfach

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

oder möglicherweise (aber nicht gleichwertig!),

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

In seiner Antwort gab ain ein paar vernünftigen Entscheidungen für den Wert ‚nicht zugewiesene Datums‘.

+0

Negative Zeitdaten werden schließlich bedeutungslos, wenn der Kalender bricht. –

+0

@David: Guter Punkt. Es gibt also viele plausible Möglichkeiten für den "nicht zugewiesenen" Wert. –

+1

Wäre es nicht sinnvoll, hier NaN als expliziten Wert zu verwenden? Sie können dann IsNaN verwenden, um die Bedingung zu testen. –

1

Verwenden Sie PDateTime anstelle von TDateTime, und senden Sie als Nullwert. Wenn kein Zeiger auf Wert ist, wird kein Wert ausgegeben.

Um Wert Verwendung Assigned ptr zu überprüfen:

MyDatePointer := nil; 
if (Assigned(MyDatePointer)) then ... 
1

tDateTime für die Werte zwischen 0 nicht definiert sind und -1, was bedeutet, dass ein tDateTime von -0,5 einen nicht definierten Wert ist und nützlich für ein Null-Datum als Alternative zu NaN. DateTimeToString wird -0.5 genauso anzeigen wie +0,5;