Kontakt
DSVGO
Die in VB eingebaute DateAdd-Funktion erlaubt es, zu einem Datum/Zeit-Wert ein bestimmtes Intervall zu addieren. So wird im folgenden Beispiel zu einer Date-Variablen 5 Minuten ("n", s.a. VB-Hilfe für Intervall-Strings) addiert:
t = DateAdd("n", 5, t)
Date-Variablen werden intern als Fließkommazahlen gespeichert: Der Vorkomma-Anteil gibt an, wieviele Tage seit dem 30.12.1899 ("Tag 0") vergangen sind, der Nachkomma-Anteil enthält die Uhrzeit als "Tagesanteil". D.h., dass z.B. 0 Mitternacht ("00:00") entspricht, und 0,5 gerade Mittag ("12:00").
Anschauen kann man sich dies, wenn man die CDbl-Funktion benutzt, um einen Datumswert als Zahl darzustellen: So gibt CDbl(Now) am 20.02.2002 um genau 18:00 den Wert 37307,75 zurück.
Jetzt könnte man auf die Idee kommen, die DateAdd-Funktion durch eine einfache Addition zu ersetzen. Dann müßten doch folgende zwei Zeilen (Addition von einem Tag) äquivalent sein:
t = #2002/2/20# Print DateAdd("d", 1, t) 'ergibt 21.2.2002 Print t + 1 'ergibt 21.2.2002
Tatsächlich, beide Varianten liefern das selbe Ergebnis! Doch welche Variante ist besser bzw. schneller?
Ich habe mir mal die Mühe gemacht, die Laufzeiten der beiden oben gezeigten Varianten bei verschiedenen Kompilier-Methoden zu messen (WinNT4 SP6, VB5 SP3, P3 600Mhz). Heraus kamen folgende Resultate (für jeweils 1.000.000 Durchläufe):
Kompilat | DateAdd("n", 5, t) | t + 5 * ConstMinute | Bemerkung |
IDE | 87,11 s | 1,71 s | Entwicklungsumgebung: Faktor 51 |
P-Code | 87,11 s | 1,27 s | Interpretiert: Faktor 69 |
Native | 82,81 s | 0,80 s | "Echt" kompiliert: Faktor 104 |
Optimiert | 83,05 s | 0,45 s | Alle Compiler-Optionen auf Speed: Faktor 185 |
Um die Zeit-Addition komfortabel (und sprechend) nutzen zu können, empfehle ich folgende Konstanten zu verwenden (am Besten im Deklarationsteil eines Moduls einbinden):
Const cDatePartWeek As Single = 7 Const cDatePartDay As Single = 1 Const cDatePartHour As Single = 1 / 24 Const cDatePartMinute As Single = 1 / (24 * 60) Const cDatePartSecond As Single = 1 / (24 * 60 * 60&)
Wenn dann z.B. 5 Minuten addiert werden müssen, kann dies einfach so geschrieben werden:
t = t + 5 * cDatePartMinute
Tipp: Bei besonders Zeit-kritischen Code-Abschnitten kann die obige Performance sogar noch um bis zu 50% verbessert werden. Verwenden Sie einfach eine selbst-definierte Konstante, die gerade dem gewünschten Zeit-Abschnitt entspricht, so dass die Multiplikation entfallen kann. Beispiel (Addition von 5 Minuten):
Const c5Minutes As Single = 5 * cDatePartMinute t = t + c5Minutes
Die oben gezeigte schnelle Methode versagt bei der Addition von Monaten und Jahren, da diese unterschiedlich lang sind (Monate haben 28 bis 31 Tage, Jahre haben 365 oder 366 Tage).
Hier könnte man analog zu dem im Artikel "Schaltjahr bestimmen" gezeigten schnellen Algorithmus vorgehen. Oder man verwendet ausnahmsweise doch DateAdd...
© Jost Schwider, 20.02.2002-20.02.2002 - http://vb-tec.de/dateadd.htm