Eine Differenz zwischen zwei Datumswerten (des Datentyps Date)
können Sie auf zweierlei Wegen berechnen. Zum einen können Sie die
DateDiff-Funktion verwenden. Diese liefert jedoch den Differenzwert
nur ein einer einzigen wählbaren Einheit. Sie können so die
Differenz nur entweder in Sekunden, oder in Minuten, oder in
Stunden, oder in Tagen usw. erhalten. Die Umrechnerei, etwa aus der
Gesamtzahl der Sekunden in Minuten, Stunden, Tage usw. bleibt Ihnen
selbst vorbehalten.
Zum anderen können Sie den einen Wert vom anderen abziehen und
erhalten so einen neuen Datumswert. Als Datum ist dieser
augenscheinlich wertlos - die Differenz zwischen heute und gestern
ergäbe als Datum den 31.12.1899.
Ein Datumswert ist aber eigentlich nichts anderes ist als eine
Fließkommazahl, deren ganzzahliger Anteil die Anzahl der Tage seit
dem 30.12.1899 (dem als 0 definiertierten Tag) und
deren Nachkommaanteil die Uhrzeit enthält. Der Wert 1
als ganzzahliger Anteil der Differenz zwischen heute und gestern
entspricht damit durchaus der tatsächlichen Differenz in Tagen.
Eine Differenz unter Berücksichtigung der Uhrzeit wird ebenso
korrekt ermittelt. Die Differenz der Stunden, Minuten und Sekunden
finden sich im Nachkommaanteil wieder. Und bei einer Differenz
größer als 24 Stunden kommt wieder der entsprechende
Tageswert als ganzzahliger Anteil dazu.
Eine einfache Prozedur, die die Differenz zwischen zwei
Datumswerten ermittelt und die jeweiligen Anteile an Tagen, Stunden,
Minuten und Sekunden zurückgibt, könnte folgendermaßen aussehen
(Date1 ist das ältere, Date2 das jüngere Datum):
Private Sub DateDiffValues(Date1 As Date, Date2 As Date, _
Days As Long, Hours As Long, Minutes As Long, Seconds As Long)
Dim nDiffDate As Date
nDiffDate = Date2 - Date1
Days = Fix(CDbl(nDiffDate))
Hours = Hour(nDiffDate)
Minutes = Minute(nDiffDate)
Seconds = Second(nDiffDate)
End Sub
Soweit scheint diese Funktion ihre Aufgabe recht ordentlich zu
erfüllen. Wenn Sie allerdings der Wert in Tagen nicht interessiert,
und Sie als größte Einheit den Wert in Stunden erhalten möchten,
müssen Sie den Tageswert wieder selbst in Stunden umrechnen und zum
Stundenwert addieren. Oder wenn Sie nur Minuten und Sekunden
interessieren, haben Sie noch mehr Rechnerei am Hals.
Etwas praktischer ist die folgende Funktion DateDiffValuesEx.
Auch ihr übergeben Sie wieder zunächst die zwei Datumswerte (oder
nur den älteren, als jüngerer wird dann automatisch der aktuelle
Datumswert über die VB-Funktion Now ermittelt), zwischen den die
Differenz ermittelt werden soll. Darüber hinaus jedoch übergeben
Sie als optionale Parameter nur diejenigen, die Sie tatsächlich
interessieren.
Public Function DateDiffValuesEx(Date1 As Date, _
Optional Date2 As Variant, Optional Weeks As Variant, _
Optional Days As Variant, Optional Hours As Variant, _
Optional Minutes As Variant, Optional Seconds As Variant) _
As Long
Dim nDateDiff As Long
If IsMissing(Date2) Then
nDateDiff = DateDiff("s", Date1, Now)
Else
nDateDiff = DateDiff("s", Date1, Date2)
End If
If Not IsMissing(Weeks) Then
Weeks = nDateDiff \ 604800
nDateDiff = nDateDiff Mod 604800
End If
If Not IsMissing(Days) Then
Days = nDateDiff \ 86400
nDateDiff = nDateDiff Mod 86400
End If
If Not IsMissing(Hours) Then
Hours = nDateDiff \ 3600
nDateDiff = nDateDiff Mod 3600
End If
If Not IsMissing(Minutes) Then
Minutes = nDateDiff \ 60
nDateDiff = nDateDiff Mod 60
End If
If IsMissing(Seconds) Then
DateDiffValuesEx = nDateDiff
Else
Seconds = nDateDiff
End If
End Function
Eine Differenz in Stunden, Minuten und Sekunden erhalten Sie also
folgendermaßen:
Dim DateOlder As Date
Dim DateNewer As Date
Dim Hours As Long
Dim Minutes As Long
Dim Seconds As Long
DateOlder = "25.04.2000 17:25:32"
DateNewer = "20.05.2000 09:48:13"
DateDiffValuesEx DateOlder, DateNewer, , , Hours, Minutes, Seconds
Oder in Minuten und Sekunden bis zum aktuellen Zeitpunkt:
Dim DateOld As Date
Dim Minutes As Long
Dim Seconds As Long
DateOld = "29.05.2000 07:25:32"
DateDiffValuesEx DateOld, , , , , Minutes, Seconds
Wenn Sie die Differenz lediglich in Sekunden erhalten möchten,
brauchen Sie außer den zu übergebenden Datumswerten (bzw. nur dem
ersten für die Differenz bis zum aktuellen Zeitpunkt) keinen der
Rückgabe-Parameter zu belegen. Der Funktionsrückgabewert enthält
immer die verbleibenden Sekunden.
|