Lektionen/Werkzeugkasten

Mit Datum & Zeit rechnen

Einsteiger9 Min. Lesezeit

Datum und Uhrzeit sind in fast jeder Access-Anwendung dabei: Fristen, Alter, Buchungszeiträume, „geändert am". Intern speichert VBA jedes Datum als Fließkommazahl — der Ganzzahlanteil zählt die Tage seit dem 30.12.1899, der Nachkommaanteil die Uhrzeit. Deshalb kannst du mit Datumswerten rechnen wie mit Zahlen. Diese Lektion zeigt dir die Werkzeuge dafür.

Aktuelles Datum und Uhrzeit

Drei eingebaute Funktionen liefern dir den Jetzt-Zustand:

FunktionRückgabeBeispiel
Datenur das Datum, Uhrzeit = 00:0001.07.2026
Timenur die Uhrzeit14:37:05
NowDatum und Uhrzeit01.07.2026 14:37:05
Public Sub ZeigeJetzt()
    Debug.Print "Heute:  "; Date
    Debug.Print "Uhrzeit:"; Time
    Debug.Print "Jetzt:  "; Now
End Sub

Der Datentyp heißt Date. Eine Variable dafür deklarierst du mit Dim faellig As Date. Verwechsle die Variable nicht mit der Funktion Date — gleicher Name, unterschiedliche Rolle.

Datum gezielt zusammenbauen: DateSerial und TimeSerial

Statt Datumswerte aus Text zu basteln, setzt du sie sauber aus Zahlen zusammen. DateSerial(Jahr, Monat, Tag) und TimeSerial(Stunde, Minute, Sekunde) sind dabei robust gegen jede Regionaleinstellung:

Dim start As Date
start = DateSerial(2026, 12, 24)          ' 24.12.2026

Dim termin As Date
termin = DateSerial(2026, 3, 15) + TimeSerial(9, 30, 0)   ' 15.03.2026 09:30

Ein Trick von DateSerial: Es rechnet Überläufe korrekt um. DateSerial(2026, 2, 30) ergibt den 2. März 2026, und mit Tag 0 bekommst du den letzten Tag des Vormonats:

Dim letzterTag As Date
letzterTag = DateSerial(2026, 3, 0)       ' 28.02.2026 (letzter Februartag)

Rechnen mit DateAdd

DateAdd(Intervall, Anzahl, Datum) addiert (oder subtrahiert bei negativer Anzahl) Zeiteinheiten. Das Intervall ist ein Kürzel als Text:

KürzelEinheit
"yyyy"Jahr
"m"Monat
"d"Tag
"ww"Woche
"h"Stunde
"n"Minute
"s"Sekunde
Dim rechnung As Date
rechnung = Date

Dim faellig As Date
faellig = DateAdd("d", 14, rechnung)      ' Zahlungsziel: 14 Tage
Debug.Print "Fällig am "; faellig

Dim inEinemJahr As Date
inEinemJahr = DateAdd("yyyy", 1, rechnung)

DateAdd versteht Monatsgrenzen: DateAdd("m", 1, DateSerial(2026, 1, 31)) ergibt den 28.02.2026, nicht etwa einen ungültigen 31. Februar.

Differenzen mit DateDiff

DateDiff(Intervall, Startdatum, Enddatum) liefert die Anzahl der Einheiten zwischen zwei Zeitpunkten:

Dim tage As Long
tage = DateDiff("d", DateSerial(2026, 1, 1), Date)
Debug.Print "Tage seit Jahresbeginn: "; tage

Achtung: DateDiff("yyyy", ...) zählt nur die Kalenderjahr-Grenzen, nicht volle Jahre. Vom 31.12.2025 zum 01.01.2026 ist das schon 1, obwohl nur ein Tag vergangen ist. Für echtes Alter brauchst du deshalb einen anderen Weg — gleich mehr dazu.

Einzelteile herausholen: DatePart, Year, Month, Day

Zum Zerlegen eines Datums gibt es die kurzen Funktionen Year, Month, Day, Hour, Minute, Second — und das flexible DatePart:

Dim d As Date
d = Now

Debug.Print Year(d), Month(d), Day(d)      ' 2026  7  1
Debug.Print DatePart("q", d)               ' Quartal, z. B. 3
Debug.Print DatePart("ww", d)              ' Kalenderwoche

Für die deutsche Kalenderwoche (Montag als Wochenstart, erste Woche mit mindestens 4 Tagen) gibst du die Parameter mit:

Debug.Print DatePart("ww", d, vbMonday, vbFirstFourDays)

Datum ausgeben mit Format

Für die Anzeige wandelst du ein Datum mit Format in Text um. Du bestimmst das Muster selbst:

Debug.Print Format(Now, "dd.mm.yyyy")            ' 01.07.2026
Debug.Print Format(Now, "dd.mm.yyyy hh:nn")      ' 01.07.2026 14:37
Debug.Print Format(Now, "dddd, d. mmmm yyyy")    ' Mittwoch, 1. Juli 2026
Debug.Print Format(Date, "Long Date")            ' benannt, folgt der Windows-Region

Merke: Im Format-Muster steht mm für den Monat, aber nn für die Minute — m neben Stunden interpretiert VBA sonst als Monat.

Datumsliterale mit # und die SQL-Falle

Ein festes Datum schreibst du im Code als Literal zwischen Rauten. Innerhalb von # # gilt immer das US-Format #mm/dd/yyyy#, egal welche Regionaleinstellung der Rechner hat:

Dim stichtag As Date
stichtag = #12/31/2026#          ' 31. Dezember 2026 (Monat zuerst!)

Genau diese Regel ist die häufigste Datumsfalle in Access. Sobald du ein Datum in einen SQL-String einbaust, musst du es ins US-Format bringen — sonst wird aus dem 3. Juli klammheimlich der 7. März:

' FALSCH – deutsches Format im SQL-String
Dim sqlFalsch As String
sqlFalsch = "SELECT * FROM Bestellungen WHERE Datum >= #01.07.2026#"

' RICHTIG – Datum sauber als #mm/dd/yyyy# formatieren
Dim vonDatum As Date
vonDatum = Date

Dim sql As String
sql = "SELECT * FROM Bestellungen " & _
      "WHERE Datum >= #" & Format(vonDatum, "mm\/dd\/yyyy") & "#"

Debug.Print sql

Faustregel: In Formularen und Berichten zeigst du deutsche Datumsformate. In SQL-Strings baust du Datumswerte ausschließlich mit Format(wert, "mm\/dd\/yyyy") und Rauten ein. Die Backslashes schützen die Schrägstriche davor, als Trennzeichen der Regionaleinstellung ersetzt zu werden.

Praxis: Alter korrekt berechnen

Ein sauberes Alter berücksichtigt, ob der Geburtstag dieses Jahr schon war. Der Trick: Jahresdifferenz nehmen und einen abziehen, falls der Geburtstag noch aussteht.

Public Function Alter(ByVal geburt As Date, _
                      Optional ByVal stichtag As Date = 0) As Long
    If stichtag = 0 Then stichtag = Date

    Dim jahre As Long
    jahre = DateDiff("yyyy", geburt, stichtag)

    ' Geburtstag im Stichjahr noch nicht erreicht? Dann ein Jahr abziehen.
    If DateSerial(Year(stichtag), Month(geburt), Day(geburt)) > stichtag Then
        jahre = jahre - 1
    End If

    Alter = jahre
End Function

Testen im Direktfenster:

? Alter(#3/15/1990#)      ' liefert das Alter zum heutigen Tag

Weil Alter eine Public Function ist, kannst du sie sogar direkt in einer Abfrage oder als Steuerelement-Quelle in einem Formular verwenden.

Zusammengefasst

  • Date, Time, Now liefern den Ist-Zustand; der Datentyp Date ist intern eine Zahl, mit der du rechnen kannst.
  • Datumswerte baust du robust mit DateSerial/TimeSerial statt aus Text.
  • DateAdd verschiebt, DateDiff misst Abstände — aber DateDiff("yyyy", …) zählt Kalendergrenzen, nicht volle Jahre.
  • Datumsliterale # # und jedes Datum in SQL-Strings sind im US-Format #mm/dd/yyyy# — nutze Format(wert, "mm\/dd\/yyyy").
  • Format steuert die Anzeige: mm = Monat, nn = Minute.
Nächste Lektion
Dateien & Ordner mit dem FileSystemObject