2013-02-20 16 views
8

bir " atanmamış değer" değişkenler TDateTime yaDelphi: belirlemek ve boş TDateTime değeri

beklediğimizden tek yolu kullanıyor ( NULL atamak için bir yolu yoktur görünüyor nasıl. böyle bir şey:

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 tarih değerini örtüşür değil ne daha iyi bir çözüm bilen kimse var mı

neg musunuz? ative TDateTime değerleri tehlikeli midir?

+0

Bu işlevi kullanmayı düşünürseniz, sanırım "NullDate" global bir sabit olmalı? –

+0

Sıfır değerine sahip TDateTime değişkeni const değeri 0 ile karşılaştırırken sorunlarla karşılaştım. A _simple_ ** bu seçenek 'var v_datetime: TDatetime;' 'v_datetime: = 0; 'if (v_datetime = 0) o zaman actionToTake' – xsubira

+3

Bunun nedeni, kayan noktalı fuzz olmasıdır. 'Math.IsZero' kullanın. –

cevap

9

, TDateTime türü "null" aslında double ve böylece değildir. Bu 00/00/0000 imkansız bir tarih temsil ettiği gibi bir boş zaman değeri için

const 
    c_UnassignedDate = -693594; 

kullanın. Ama örneğin DevExpress
NullDate = -700000; 
InvalidDate = NullDate + 1; 

Yani hayır, size ihtiyacı uygun olanı seçmelidir standart vale kararlaştırılacak görünüyor kullanır.

+2

** gün ** ve ** ayın ** 0 (sıfır) olduğu tarih yok. Veritabanında, tarih atama yapılmazsa, 'NULL' kullanılmalıdır, bazı sihirli tarihler kullanılmamalıdır. – ain

+1

Evet, pardon. Geriye dönersek, o tarihin sadece yıl dilimine bakıyordum ... Eğer belli bir tarih zaman sütununun değeri "NULL" ise ve bu değeri kesinlikle bir "TDateTime" alanına saklamak zorunda kalırsam, muhtemelen 'c_UnassignedDate' sabit değerini kullanırdı. [+1] – TLama

+0

-693594'ün 0/0/0000 tarihini nasıl temsil ettiğini düşünüyorsunuz? –

9

İlk (önceki amaçla yetenekli bir kaynak olarak) size 'boş TDateTime değeri' ile ne demek tanımlamanız gerekir.

bir TDateTime değeri tam sayı kısmı ve fraksiyonel kısmında kodlanmış zaman kodlanmış tarihi ile iki katıdır. Yani, 'null date' için en yakın şey muhtemelen 0'dur.

Dolayısıyla, sadece tarih 'boş' olup olmadığını test etmek ADate <> 0 test edin.

Ancak dikkat: TDateTime yerel değişkenini bildirirseniz, bir değer vermeden önce mutlaka =0 olmaz. Her şey olabilir. Tabii ki, aynı şey değere 0 ile TDateTime tarihi 1899/12/30 kodlar inanıyoruz ... tip integer, double, boolean, değişkenlerine Ayrıca

geçerlidir.

Son olarak, negatif TDateTime değerler ve normaldir. Örneğin, -5000, 1886-04-22'a karşılık gelir.

Kodunuzu tam olarak anlamıyorum. Eğer (eğer 1899-12-30 yakın tarihlerde ilgileniyorsanız kötü) 'atanmamış' değeri olarak 0 kullanmak istiyorsanız, neden olasılıkla (ama eşit biçimde, sadece

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

ya da değil!), Cevaben

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

, ain 'atanmamış tarihi' değeri için daha makul seçimler bir çift verdi. Andreas zaten yazdığı gibi

+0

Olumsuz zaman tarihleri, takvim bozulduğunda, sonuç olarak anlamsız hale gelir. –

+0

@David: İyi nokta. Yani 'atandı' değeri için aslında çok sayıda makul seçenek var. –

+1

Burada açık bir değer olarak NaN kullanmak yararlı olmaz mıydı? Daha sonra durumu test etmek için IsNaN kullanabilirsiniz. –

1

PDateTime yerine TDateTime kullanın ve sıfır değeri olarak gönderin. Değer verilecek bir değer yoksa, sonuç değeri olmaz.

değeri kullanımı Atanan ptr kontrol etmek için:

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

TDateTime 0 ile -1 arasındaki değerler için tanımsız -0.5 bir TDateTime alternatif olarak boş bir tarih için tanımlanmamış bir değer ve kullanışlı olduğu anlamına gelir NaN'ye DateTimeToString, -0.5'i +0.5 ile aynı görüntüler;