|
Auf den ersten Blick scheint die Unterscheidung nicht so einfach zu sein, ob es sich bei einem Datumswert in einer Variablen des Datentyps Date um ein reines Datum ("16.5.2001"), um eine reine Uhrzeit ("12:34:56") handelt, oder ob es ein Zeitwert in der Art eines Zeitstempels mit Datums- und Zeitanteil ("16.05.2001 12:34:56") handelt.
Zur Erinnerung: Eine Variable des Datentyps Date wird intern als Zahl des Datentyps Double verwaltet. Dabei wird der Uhrzeit-Anteil als Dezimalbruch bezogen auf einen ganzen Tag dargestellt, der Tages-Anteil wird vom ganzzahligen Anteil repräsentiert.
Die Eingangs gefragte Unterscheidung kann also recht einfach über eine Prüfung des in einen Double-Wert konvertierten Datums-Wertes erfolgen. Ist er eine reine Ganzzahl, also gleich dem Ergebnis einer Konvertierung per CLng, ist er ein reiner Tageswert:
Public Function IsDateDate(TestDate As Date) As Boolean
IsDateDate = CBool((CLng(TestDate) = CDbl(TestDate)))
End Function
Die zweite Prüfung, ob es sich um einen reinen Zeitwert handelt, ergibt sich auch aus der vorstehenden Funktion - dann gibt sie ja False zurück. Sie können das aber auch in einer eigenständigen Funktion prüfen - entweder als simple Negation des Rückgabewerts:
Public Function IsDateDateTime(TestDate As Date) As Boolean
IsDateDateTime = Not CBool((CLng(TestDate) = CDbl(TestDate)))
End Function
oder auf direktem Wege:
Public Function IsDateTime(TestDate As Date) As Boolean
IsDateTime = Not CBool(Fix(CDbl(TestDate)))
End Function
Einen kleinen Haken hat diese Testmöglichkeit allerdings. Sie scheidet aus, wenn als Datum der 30.12.1899 bzw. als Zeitstempel dieses Datum mit 0 Uhr als Uhrzeit auftreten kann. Denn der interne Double-Wert dafür ist ebenfalls exakt 0.
|