Datumswerte mit und ohne Zeitangabe vergleichen

Prüfen auf Identität

Möchten Sie prüfen, ob es in einer Tabelle beziehungsweise einem Feld der Tabelle Datumsangaben gibt, die dem heutigen Datum entsprechen, müssen Sie prüfen, ob das Ergebnis mit dem aktuellen Datum identisch ist, das von der Funktion Datum geliefert wird.

Vergleichen Sie einen Feldwert mit dem Rückgabewert der Funktion Datum, wird der Feldwert nur mit einem Datum verglichen. Ist im Feldwert auch eine Zeitangabe gespeichert, wird diese nicht einfach ignoriert, sondern führt dazu, dass beide Werte als ungleich erkannt werden, auch wenn das Datum übereinstimmt. Der Ausdruck #01.01.2006 00:02# = Datum() hat somit auch dann den Wert false, wenn die Funktion Datum den 01.01.2006 liefert.

Es gibt mehrere Lösungen für das Problem. Die einfachste besteht darin, ein berechnetes Feld zu erzeugen, das nur den Datumsbestandteil des Feldes enthält. Dieses können Sie dann mit dem Rückgabewert der Funktion Datum vergleichen (Bild 2). Am einfachsten erreichen Sie das, indem Sie die Format-Funktion verwenden und als Format tt/mm/jjjj angeben.

Bild 2: Vergleichen eines Feldes mit dem aktuellen Datum.
Bild 2: Vergleichen eines Feldes mit dem aktuellen Datum.

SELECT tabDatumswerte.ID, tabDatumswerte.DatumundZeit, tabDatumswerte.Datum, tabDatumswerte.
Zeit, Date() AS Heute, tabDatumswerte.AktuellesDatum, Format([DatumundZeit],"
hh:nn:ss") AS ZeitAusDatum
FROM tabDatumswerte
WHERE (((Format([DatumundZeit],"hh:nn:ss"))=#17:00:00#));

Ähnliches gilt für den Vergleich von Zeiten. Werden diese als einzelne Werte gespeichert, gelingt ein Vergleich mit einem Zeitwert problemlos, falls Sie den Vergleichswert in der Form #00:00:00# angeben oder von einer Funktion zurückgeben assen, die einen Zeitwert liefert. Eine Abfrage, die korrekte Ergebnisse für den Vergleich von Zeiten mit der Uhrzeit 17:00:00 liefert, könnten beispielsweise wie folgt lauten:

Suchen nach Werten in der Vergangenheit und der Zukunft

Interessant ist in vielen Fällen auch die Prüfung, ob ein Datumswert in der Vergangenheit oder Zukunft liegt. Dazu müssen Sie die Datumswerte mit dem aktuellen Datum vergleichen und auf kleiner oder größer prüfen. Hierbei ergibt sich ein neues Problem. Verwenden Sie als Kriteriumsausdruck <Datum() erfüllen nur die Datensätze das Kriterium, deren Datumswert bei einer Sortierung nach Zeichenfolgen kleiner ist als das aktuelle Datum. Falls das aktuelle Datum der 01.01.2006 ist, würde zwar ein Datum 01.01.2005 als kleiner erkannt werden, nicht aber der 31.12.2005, obwohl das Datum definitiv in der Vergangenheit liegt. Das Datum wird jedoch als Zeichenfolge verglichen, und die Zeichenfolge "31.12.2005" ist nun mal größer als "01.01.2005", weil Letztere mit einer 0, die erste aber mit einerm 3 beginnt.

Um den Datumswert korrekt zu vergleichen, benötigen Sie also einen numerischen Wert, der dann nicht als Zeichenkette verglichen wird. Die Lösung ist die Funktion DatWert. Sie liefert einen numerischen Wert für ein Datum. Als Parameter übergeben Sie eine Zeichenkette, die ein gültiges Datum beinhaltet. Das können Sie mit der Format- Funktion aus einem Datumsfeld mit oder ohne Zeitangabe erzeugen. Mit folgendem Code definieren Sie in der Entwurfsansicht einer Abfrage ein berechnetes Feld Datumswert, das den numerischen Wert des Datums im Feld DatumundZeit enthält.

Datumswert
DatWert(Format([DatumundZeit];"tt.mm.jjjj"))

Dieses können Sie dann mit dem numerischen Wert des aktuellen Datums DatWert(Datum()) vergleichen (Bild 3).

Bild 3: Vergleichen eines Datumswertes mit dem Operator kleiner als.
Bild 3: Vergleichen eines Datumswertes mit dem Operator kleiner als.

Schon problematischer sind solche Vergleiche, wenn Sie auch die Uhrzeit berücksichtigen möchten. Falls Sie alle Datensätze ermitteln möchten, deren Datum unter Berücksichtigung der aktuellen und der gespeicherten Uhrzeit in der Vergangenheit liegt, bringt Sie die Funktion DatWert alleine nicht weiter. Sie liefert nämlich unabhängig von der gespeicherten Uhrzeit immer den gleichen Datumswert, wenn das Datum übereinstimmt. Für die Werte #01.01.2006 08:00:00# und #01.01.2006 19:00:00# liefert die Funktion also den gleichen Wert. Bei einem Vergleich wie dem in Bild 3 würden also alle Datensätze mit dem Datum des aktuellen Tages nicht mitgeliefert werden, weil der Tag nicht kleiner istals der aktuelle. Bei Angabe von <= als Vergleichsoperator würden hingegen auch die Datensätze geliefert, deren Uhrzeit in der Zukunft liegt.