Das Speichern von Datum- und Zeitwerten mit Access birgt wenige Geheimnisse. Sie fügen einer Ta-belle ein Feld vom Datentyp “Datum/Zeit” hinzu und schon können Sie Werte in dieses Feld eingeben. Die tägliche Praxis im Umgang mit Datums- und Zeitwerten stellt jedoch höhere Anforderungen. Mit den Tipps aus dem folgenden Beitrag können Sie die meisten der sich stellenden Fragen beantworten.
Ein Wert mit vielen Gesichtern
Innerhalb Deutschlands geben die meisten Menschen einen Datumswert intuitiv als 5.3.2023, als 05.03.2023 oder schreibfaul als 5.3.23 oder mit Mischformen ein. Access versteht all diese Schreibweisen und interpretiert sie als den gleichen Tag, den 5.3.2023.
Selbst Angaben im Klartext wie beispielsweise 5. März 2023 sind bei der Dateneingabe erlaubt. Sie müssen lediglich darauf achten, dass Ihre Eingabe den in der Systemsteuerung von Windows getätigten Ländereinstellungen entspricht.
Wie speichert Access Datum- und Zeitwerte?
Dass Access Ihre Eingabe richtig versteht, können Sie leicht feststellen, indem Sie ein Formular mit einem Textfeld namens txtDatumZeit anlegen.
Fügen Sie dem Formular ein weiteres Textfeld namens txtDatum mit dem folgenden Steuerelementinhalt hinzu:
=Format([txtDatumZeit];"tt.mm.jjjj")
Mit einem weiteren Textfeld namens txtZeit können Sie die Zeitangabe aus dem Eingabewert ermitteln. Geben Sie für dieses den folgenden Steuerelementinhalt ein:
=Format([txtDatumZeit];"hh:nn:ss")
Access erkennt selbständig, dass es sich bei dem eingegebenen Text um einen Datum- und Zeitwert handelt und wandelt ihn in automatisch in diesen Datentyp um. Die Format-Funktion formatiert den Wert aus dem Steuerelement txtDatumZeit im ersten Fall als Datums- und im zweiten Fall als Zeitwert. Mit tt.mm.jjjj erhalten Sie die Anzeige mit zweistelligem Tages-, zweistelligem Monats- und vierstelligem Jahreswert. Das Zeitformat zeigt Stunden, Minuten und Sekunden ebenfalls zweistellig an.
Nun können Sie nacheinander verschiedene Datumswerte in das Textfeld eingeben und beobachten, welchen Datumswert und welchen Zeitwert Access ermittelt.
Ein Beispiel hierfür sehen Sie in Bild 1.
Bild 1: Mit diesem Formular können Sie prüfen, ob Access Ihre Datums- und Zeiteingabe versteht.
Sie können allerlei verschiedene Eingaben für den gleichen Tag tätigen. Wenn Sie wissen wollen, wie Access die Werte intern speichert, dann fügen Sie dem Formular drei weitere Steuerelemente mit folgenden Formeln als Steuerelementinhalt hinzu:
=ZDouble(ZDate([txtDatumZeit])) =DatWert([txtDatumZeit]) =ZeitSeriellStr([txtDatumZeit])
Besonders interessant ist die ZDate-Funktion (englisch: CDate). Diese Funktion wandelt irgendeinen Wert, in diesem Fall die eingegebene Zeichenkette, in den Datentyp DatumZeit um. Der anschließende Aufruf von ZDouble (englisch: CDbl) führt dazu, dass Access den berechneten Wert als Zahl mit Nachkommastellen anzeigt. Ein Beispiel hierfür sehen Sie in Bild 2.
Bild 2: Beispiel für die Umrechnung eines Datums- und Zeitwertes in einen Double-Wert.
Access wandelt beispielsweise 14.03.2023 10:35:32 in den Double-Wert 499,4413425926 um. Der Grund hierfür besteht darin, dass Access Datums- und Zeitwerte als Double-Werte kodiert.
Der ganzzahlige Anteil speichert die Anzahl der Tage in Bezug auf den 30.12.1899. Negative Werte geben die Anzahl der Tage vor diesem Datum an und positive Werte die Anzahl der Tage nach diesem Datum.
Der Nachkommanteil entspricht jeweils der seit 0 Uhr vergangen Zeit. Der Zeitpunkt 30.12.1899 0:00:00 entspricht dem Double-Wert 0,0.
Rechnen mit Datum und Zeit
Aufgrund der internen Umrechnung in Double-Werte können Sie mit Datums- und Zeitwerten rechnen. Bei der Addition von zwei Werten erhalten Sie absolut sinnvolle Ergebnisse. Das in Bild 3 gezeigte Beispielformular enthält zwei Textfelder zur Dateneingabe.
Bild 3: Beispiel für die Addition von zwei Datum-/Zeit-Werten
Der eingegebene Text wird jeweils wie oben beschrieben mit ZDate() und ZDouble() in einen Double-Wert umgerechnet. Das Textfeld txtSumme berechnet dann die Summe aus den beiden Werten. Das unterste Textfeld zeigt den berechneten Wert als Standarddatum formatiert an.
Im Beispiel wurden zu dem Datum/Zeit-Wert 14.03.2023 23:00:00 zwei Stunden hinzuaddiert. Als Ergebnis erhalten Sie den Datum/Zeit-Wert 15.03.2023 01:00:00.
Hinweis: Beim Rechnen mit Datum/Zeit-Werten dürfen Sie nur positive Zahlen oder nur ganze Zahlen verwenden. Bei Datumswerten vor dem 30.12.1899 wird dem negativen ganzzahligen Anteil der positive Nachkommaanteil hinzugerechnet.
Wenn Sie beispielsweise dem Datum/Zeit-Wert 15.12.1899 23:00:00 (entspricht -15,9583333333333) zwei Stunden (entspricht 0,0833333333333333) hinzuaddieren, dann erhalten Sie das fehlerhafte Ergebnis 15.12.1899 21:00:00.
Funktionen für Datum und Zeit
Access verfügt über eine ganze Reihe eingebauter Funktionen für die Berechnung von Datum- und Zeit-Werten. Mit der Jetzt-Funktion erhalten Sie die aktuelle Systemzeit inklusive Datum. Die Datum-Funktion liefert nur das Datum, die Jetzt-Funktion nur die Zeit.
Addieren von Zeitintervallen
Mit der DatAdd-Funktion (englisch: DateAdd) können Sie eine Sekunde (s), eine Minute (n), eine Stunde (h), einen Tag (d), einen Wochentag (w), einen Tag des Jahres (y), eine Woche (ww), einen Monat (m), ein Quartal (q) oder ein Jahr (yyyy) zu einem Datumswert hinzuaddieren. Die in Klammern angegebenen Werte können Sie als Parameter für die DatAdd-Funktion verwenden. Bild 4 zeigt exemplarisch das Addieren einer Woche und eines Monats zu einem Datumswert.
Bild 4: Addition einer Woche und eines Monats zu einem Datumswert
Die in der Abbildung gezeigten Werte können Sie mit den folgenden beiden Ausdrücken berechnen:
=DatAdd("ww";1;[txtDouble1]) =DatAdd("m";1;[txtDouble1])
Differenz in Tagen, Wochen und Monaten
Für viele Berechnungen benötigen Sie die Differenz zwischen zwei Datumswerten nicht einfach nur als Double-Zahl, sondern als konkret benanntes Intervall.
Mit der DateDiff-Funktion ermitteln Sie die Differenz zwischen zwei Zeitpunkten in Sekunden (s), Minuten (n), Stunden (h), Wochen (ww), Wochentagen (w), Tagen (d), Tagen des Jahres (y), Monaten (m), Quartalen (q) und Jahren (y) . So berechnet beispielsweise der Ausdruck
=DatDiff("d";[txtDouble1];[txtDouble2];2;2)
die Differenz zwischen zwei Datumswerten in Tagen. Der erste Parameter bezeichnet das Intervall. Das d für englisch Day veranlasst Access, die Differenz in Tagen zu berechnen. Der zweite und dritte Parameter bezeichnen zwei Steuerelemente mit Datumswerten.
Parameter Nummer vier und fünf sind optional, sollten aber im deutschsprachigen Raum angegeben werden.
Diese beiden Parameter bestimmen, wie Access die Kalenderwochen zählt. Mit der ersten 2 legen Sie fest, dass der erste Tag einer Woche der Montag (2 = vbMonday) ist. Mit der zweiten 2 legen Sie fest, dass die erste Kalenderwoche eines Jahres die erste Woche im neuen Jahr mit mindestens 4 Tagen ist.
Etwas seltsam ist die Unterscheidung zwischen der Differenz in Wochentagen (w) und Wochen (ww). Falls Sie dieses Thema interessiert, sollten Sie sich den genauen Text in der Hilfe durchlesen.
Eine verständliche Interpretation des Hilfetextes könnte wie folgt lauten: Bei Verwendung des Parameters w berechnet Access die Anzahl voller Kalenderwochen mit 7 Tagen, die zwischen den beiden Datumswerten liegen.
Bei Verwendung des Parameters ww zählt Access die Anzahl der Sonntage zwischen den beiden Datumswerten. Dabei wird das zweite Datum nicht mitgezählt, sofern es auf einen Sonntag fällt. Dieser Wert ist entweder gleich oder größer als der mit w ermittelte.
Wenn Sie wie in Bild 5 beispielsweise die Wochen von Sonntag, den 5.3.2023 bis Montag, den 13.3.2023 mit DateDiff berechnen, dann erhalten Sie bei Verwendung des Parameters w ein Ergebnis von einer Woche und bei Verwendung des Parameters ww ein Ergebnis von zwei Wochen. Tatsächlich liegen zwischen den beiden Zeitpunkten acht Tage.
Bild 5: Berechnungen mit DateDiff
Wenn Sie hingegen die Differenz von Sonntag, den 5.3.2023 und Sonntag, den 12.3.2023 berechnen, dann ermitteln beide Parameter den gleichen Wert 1 als Ergebnis. Der Grund besteht darin, dass auch bei Verwendung von ww der zweite Sonntag nicht mitgezählt wird.
Datumsteile ermitteln
Mit der DatTeil-Funktion (englisch: DatePart) können Sie die Jahreszahl (yyyy), das Quartal (q), den Monat (m), den Tag des Jahres (y), den Tag (d), den Wochentag (w), die Woche (ww), die Stunde (h), die Minute (n) oder die Sekunde (s) aus einem Zeitpunkt berechnen. Mit dem fol-genden Ausdruck berechnen Sie beispielsweise den Tag des Jahres des im Steuerelement txtZeitpunkt gespeicherten Zeitpunkts:
=DatTeil("y";[txtZeitpunkt];2;2)
Am 8.3.2023 ist dies der Wert 73, am 31.12 des Schaltjahres 2024 ist es der Wert 366. Bild 6 enthält eine Übersicht der verschiedenen Datumsteile.
Bild 6: Ergebnisse der DatTeil-Funktion
Typen umwandeln
Die DatSeriell-Funktion (englisch: DateSerial) ermittelt einen Datumswert aus den in dieser Reihenfolge angegebenen Werten Jahr, Monat und Tag.
Ein Beispiel lautet:
=DatSeriell(2023;3;14)
Die korrespondierende Funktion ZeitSeriell (englisch: TimeSerial) berechnet einen Zeitwert aus Stunde, Minute und Sekunde:
=ZeitSeriell(14;39;15)
Mit der ZDate-Funktion (englisch: CDate) wandeln Sie einen Ausdruck in einen Datumswert um. Ein Beispiel für die Umwandlung einer Zeichenkette lautet wie folgt:
=ZDate("13 März 2023")
Dazu korrespondierend wandelt die ZeitSeriellStr-Funktion (englisch: TimeValue) einen Ausdruck in einen Zeitwert um:
=ZeitSeriellStr("14:43:20")
Mit der IstDatum-Funktion (englisch: IsDate) können Sie feststellen, ob sich ein Ausdruck in einen Datumswert umwandeln lässt.
Praxis mit Datum und Zeit
Mit den bisher beschriebenen Funktionen können Sie die meisten Aufgabenstellungen im Zusammenhang mit Datum- und Zeitwerten lösen. Die folgenden Abschnitte beschreiben die Berechnung einiger häufig benötigter Kennziffern. Sie finden alle Beispiele im Formular frmFunktionen in der Beispieldatenbank zu diesem Beitrag (siehe Bild 7).
Bild 7: Diese Abbildung enthält eine Übersicht der häufig verwendeten Datums- und Zeitfunktionen.
Erster des Monats
Bei der Berechnung des ersten Tages eines Monats können Sie sich zu Nutze machen, dass Access den Tag eines Datums als ganze Zahl speichert.
Von dieser Zahl brauchen Sie nur die Anzahl der in diesem Monat vergangenen Tage abzuziehen und das Ergebnis wieder in einen Datumswert umzurechnen. Mit der folgenden Formel berechnen Sie den ersten Tag des Monats auf der Basis des Datumswertes, der in dem Steuerelement txtZeitpunkt gespeichert ist:
=[txtZeitpunkt]-Tag([txtZeitpunkt])+1
Falls in txtZeitpunkt auch eine Uhrzeit angegeben ist, wird diese übernommen. Um die Uhrzeit abzuschneiden, können Sie folgenden Ausdruck verwenden:
=Fix([txtZeitpunkt])-Tag([txtZeitpunkt])+1
Erster Tag des Folgemonats
Zur Berechnung des ersten Tages des Folgemonats verwenden Sie die gleiche Formel wie zur Berechnung des ersten Tages innerhalb des Monats. Diesen Wert erhöhen Sie mittels DateAdd-Funktion um einen Monat:
=DatAdd("m";1;[txtZeitpunkt]-Tag([txtZeitpunkt])+1)
1.1. des Jahres
Den 1.1. des aktuellen Jahres berechnen Sie mit der DatSeriell-Funktion. Setzen Sie das Datum aus der Jahreszahl des in txtZeitpunkt gespeicherten Datums, dem Monat 1 und dem Tag 1 zusammen:
=DatSeriell(Jahr([txtZeitpunkt]);1;1)
Erster Tag des Quartals
Zur Berechnung des ersten Tages im laufenden Quartal ermitteln Sie zuerst das Quartal aus dem in txtZeitpunkt enthaltenen Datumswert. Es handelt sich hierbei um einen Wert zwischen 1 und 4. Von diesem Wert subtrahieren Sie den Wert 1, so dass Sie einen Wert zwischen 0 und 3 erhalten.
Mit der DatAdd-Funktion addieren Sie die Anzahl der ermittelten Quartale zum 1.1. des laufenden Jahres. Da beispielsweise der 1.1.2023 gleichzeitig auch der 1.1. des 1. Quartals ist, erhalten Sie mit der Addition von 0–3 Quartalen die jeweiligen Quartalsanfänge:
=DatAdd("q";DatTeil("q";[txtZeitpunkt];2;2)-1;[txtErsterErster])
Letzter Tag des Quartals
Um den letzten Tag eines Quartals zu ermitteln, berechnen Sie zuerst den 1.1. des Folgequartals. Anschließend ziehen Sie von diesem Datum einen Tag ab:
=DatAdd("q";DatTeil("q";[txtZeitpunkt];2;2);[txtErsterErster])-1
Kalenderwoche ermitteln
Der folgende Ausdruck ermittelt die Kalenderwoche des im Steuerelement txtZeitpunkt gespeicherten Datums:
=DatTeil("ww";[txtZeitpunkt])
Montag einer Kalenderwoche berechnen
Auf der Seite www.donkarl.com befindet sich eine kleine VBA-Funktion, die den Montag einer Kalenderwoche berechnet und die wir ein wenig abgewandelt haben (siehe Listing 1). Sie finden diese Funktion auch in der Beispieldatenbank zu diesem Beitrag.
Public Function MontagDerKalenderwoche(intKalenderwoche As Integer, Optional intJahr As Integer) As Date Dim datMontag As Date If intJahr = 0 Then intJahr = Year(Date) End If datMontag = DateSerial(intJahr, 1, 1) + (intKalenderwoche - 1) * 7 datMontag = datMontag + 1 - Weekday(datMontag, 2) If Format(datMontag, "ww", 2, 2) <> intKalenderwoche Then datMontag = datMontag + 7 End If If (intKalenderwoche = 1 Or intKalenderwoche = 53) And Day(datMontag) > 4 And Day(datMontag) < 8 Then datMontag = datMontag - 7 End If MontagDerKalenderwoche = datMontag End Function
Listing 1: Berechnen des Montags einer Kalenderwoche
Der Ausdruck DateSerial(intJahr, 1, 1) berechnet das Datum des 1.1. des Kalenderjahres. Diesem Datum wird die Anzahl (Kalenderwoche -1) x 7 Tage hinzugerechnet. Für Kalenderwoche 5 werden dem Datum also 28 Tage hinzugerechnet. Für das Jahr 2023 ergibt sich so Sonntag, der 29. Januar 2023.
Danach wird der Montag vor diesem Datum berechnet. Dazu wird der Wochentag subtrahiert und der Wert 1 addiert.
Als Ergebnis erhalten Sie Montag, den 30.1.2023. Dies entspricht bereits dem gesuchten Ergebnis.
In der Funktion folgen aber dennoch zwei If-Abfragen, die gelegentlich auftretende Sonderfälle abdecken.
Zeiten addieren
Die Addition von Zeitwerten zu einem Datum ist mit Access absolut unproblematisch.
Mit dem folgenden Ausdruck addieren Sie 36 Stunden und 30 Minuten zu einem Zeitpunkt hinzu:
=[txtZeitpunkt]+ZeitSeriell(36;30;0)
Wenn das Steuerelement txtZeitpunkt den Wert 08.03.2023 04:00:00 enthält, dann erhalten Sie als Ergebnis den Wert 09.03.2023 16:30:00.
Etwas schwieriger ist die Anzeige der 36 Stunden.
Wenn Sie den ZeitSeriell-Wert direkt einem Steuerelement zuweisen, dann addiert Access die Zeit zum 30.12.1899, 0:00:00 Uhr und speichert den berechneten Zeitpunkt in dem Steuerelement. Zur Anzeige kommt dann der 31.12.1899, 12:00:00 Uhr.
Wie Sie dieses und ähnliche Probleme umgehen, zeigen wir im Beitrag Mit Zeiten rechnen (www.access-im-unternehmen.de/1421).
Arbeitstage addieren
Um das Enddatum eines Projekts zu berechnen, muss zum Startdatum eine bestimmte Anzahl von Arbeitstagen addiert werden. Wenn das Projekt beispielsweise am Dienstag, den 14.3.2023 startet und fünf Tage dauert, dann können Sie es bis Dienstag, den 21.3.2023 fertig stellen. Eine solche Berechnung können Sie mit der folgenden Anweisung durchführen:
=[txtStarttermin]+[txtArbeitstage] +Int(([txtArbeitstage] +Wochentag([txtStarttermin])-2)/5)*2
Ein Beispiel für diese Berechnung finden Sie im Formular frmArbeitstage in der Beispieldatenbank zu diesem Beitrag (siehe Bild 8).
Bild 8: Endtermin berechnen
Abfragen mit Datum und Zeit
Access kennt nur einen Datentyp für Datums- und Zeitwerte. Dies hat viele Vorteile, kann aber auch zur Verwirrung führen. Die folgenden Abschnitte enthalten einige Hinweise für den Umgang mit Datums- und Zeitwerten in Abfragen.
Aktuellen Preis ermitteln
Als Beispiel dient die Tabelle tblPreise. Es handelt sich hierbei um eine Preisliste, die mit der Artikeltabelle verknüpft ist. Für jeden Artikel können mehrere Preise mit einem Von- und einem Bis-Datum gespeichert werden. Es handelt sich hierbei um die Gültigkeitsdauer des Preises. Eine Überprüfung auf überlappende Zeiträume klammern wir in diesem Beispiel aus. Wir gehen davon aus, dass die Preisliste stimmt und beschäftigen uns mit der Abfrage.
Für einen ersten Test sollten Sie eine Abfrage mit den Tabellen tblArtikel und tblPreise erstellen. Access zeigt die Beziehung zwischen den beiden Tabellen in der Abfrage automatisch an. Fügen Sie dem Entwurfsbereich der Abfrage die Felder Artikel, Preis, GueltigVon und GueltigBis hinzu. Geben Sie für GueltigVon das folgende Kriterium ein:
<=#08.03.2023#
Für das Feld GueltigBis geben Sie folgendes Kriterium ein:
>=#08.03.2023#
Diese Kriterien (siehe Bild 9) sollen bewirken, dass die Abfrage alle Preise ermittelt, die am 8.3.2023 gültig sind.
Bild 9: Abfrage zur Berechnung der Preise am 8.3.2023
Wenn Sie die Abfrage ausführen, erhalten Sie das in Bild 10 gezeigte Ergebnis in der Datenblattansicht der Tabelle tblPreise. Wie Sie sehen, liefert die Abfrage leider einen Datensatz zu wenig. Der Grund hierfür besteht darin, dass Access die eingegebenen Kriterien wie folgt interpretiert:
Bild 10: Ergebnis der Berechnung der Preise am 8.3.2023
GueltigVon <= #08.03.2023 00:00:00# AND GueltigBis >=#08.03.2023 00:00:00#
Der Preis mit der ID 3 ist aber erst ab dem 8.3.2023, 12:00:01 gültig und fällt aus dem Vergleich heraus. Die Zeitangabe erweist sich hier als echter Stolperstein. Um die Abfrage zu korrigieren, ändern Sie das Feld GueltigVon den Ausdruck Von: Fix([GueltigVon]). Den Ausdruck für das Feld GueltigBis ändern Sie in Bis: Fix([GueltigBis]) (siehe Bild 11).
Bild 11: Korrigierte Abfrage zur Berechnung der Preise am 8.3.2023
Wenn Sie die Abfrage nun erneut starten, zeigt Access wie in Bild 12 alle am 8.3.2023 gültigen Preise an – auch von dem Artikel, dessen Preis mittags um 12:00 Uhr geändert wurde.
Bild 12: Ergebnis der korrigierten Berechnung der Preise am 8.3.2023
Bei der korrigierten Fassung der Abfrage ermittelt die Fix-Funktion jeweils den ganzzahligen Anteil der Felder GültigVon und GültigBis. Dies entspricht dem reinen Datumswert ohne Zeitangabe. Der Vergleich erfolgt dann automatisch für alle Datumswerte mit der nivellierten Uhrzeit 00:00:00.
Datum und Zeit in Abfragen unter VBA
Das Handling von Datums- und Zeitwerten bei der Programmierung in VBA entspricht weitgehend dem Handling in Abfragen, Formularen und Berichten. Ein wesentlicher Unterschied besteht darin, dass Sie in VBA nur die englischen Funktionsnamen verwenden dürfen. Dies gilt aber nicht nur für Datums- und Zeitfunktionen, sondern prinzipiell für alle Funktionen.
SQL-Anweisung mit Datumsvergleich
In VBA kommt es häufiger vor, dass SQL-Anweisungen im Programmcode als Zeichenkette zusammengesetzt werden. Hierbei müssen Sie beachten, dass Datumswerte in SQL-Anweisungen prinzipiell in der Form #MM/DD/YYYY# anzugeben sind. Dies betrifft sowohl die Reihenfolge von Monat, Tag und Jahr als auch die Verwendung des Schrägstrichs als Trennzeichen. Der Ausdruck muss außerdem in Rauten (#) geklammert werden.
Es ist empfehlenswert, dass Sie für die Bildung von Abfragen, WHERE-Klauseln und Filterausdrücken die in Listing 2 zu findende Funktion SQLDatum verwenden. Zum Aufruf der Funktion genügt die Angabe eines Datumswertes. Wenn Sie beispielsweise die Anweisung
Function SQLDatum(varDatum As Variant, Optional bolMitZeit As Boolean) As String Dim strErgebnis As String strErgebnis = "#" & Month(varDatum) & "/" & Day(varDatum) & "/" & Year(varDatum) If bolMitZeit = True Then strErgebnis = strErgebnis & " " & Hour(varDatum) & ":" & Minute(varDatum) & ":" & Second(varDatum) End If strErgebnis = strErgebnis & "#" SQLDatum = strErgebnis End Function
Listing 2: Formatieren des Datums für SQL-Abfragen
SQLDatum(Date)
in das Direktfenster von Access eingeben, dann erhalten Sie am 8. März 2023 als Ergebnis den Ausdruck #3/8/2023#. Bei Bedarf können Sie der Funktion als zweiten Parameter den Wert True übergeben. In diesem Fall ergänzt sie die Uhrzeit. Wenn Sie beispielsweise die Anweisung
SQLDatum(Now, True)
in das Direktfenster eingeben, dann ermittelt die Funktion den Wert #3/8/2023 18:57:8#.
Datum in VBA-SQL-Abfragen
Wenn wir nun konkret das Datum in eine SQL-Abfrage einbauen wollen, die wir per VBA nutzen, können wir genau diese Funktion nutzen, um das Datum in die benötigte Form zu bringen.
Allerdings müssen wir sie dazu noch in eine entsprechende Anweisung einbetten. Wenn wir zum Beispiel das Datum als Parameter an eine VBA-Prozedur übergeben wollen, welche die Abfrage aus qryGueltigePreiseKorrigiert verwendet, holen wir uns zuerst einmal den SQL-Code der Abfrage. Dazu öffnen wir diese in der Entwurfsansicht und klicken dann im Ribbon auf den Eintrag Abfrageentwurf|Ergebnisse|Ansicht|SQL-Ansicht (siehe Bild 13).
Bild 13: SQL-Ansicht einer Abfrage
Diese Abfrage liefert uns fix die Daten, die zum 8.3.2023 gültig sind und sieht wie folgt aus:
SELECT tblArtikel.Artikel, tblPreise.Preis, Fix([GueltigVon]) AS Von, Fix([GueltigBis]) AS Bis FROM tblArtikel INNER JOIN tblPreise ON tblArtikel.ArtikelID = tblPreise.ArtikelIDWHERE (((Fix([GueltigVon]))<=#3/8/2023#) AND ((Fix([GueltigBis]))>=#3/8/2023#));
Diesen Ausdruck übernehmen wir in einer Zeile in eine Anweisung, wo wir den Ausdruck einer Variablen namens strSQL zuweisen. Dort teilen wir die SQL-Abfrage an der Stelle, an der das Datum als Kriterium angegeben ist, auf, entfernen das Datum und fügen stattdessen ein zuvor als Prozedurparameter ermitteltes Datum ein (siehe Listing 3).
Public Sub DatumInSQLEinbetten(datDatum As Date) Dim strDatum As String Dim strSQL As String strDatum = SQLDatum(datDatum) strSQL = "SELECT tblArtikel.Artikel, tblPreise.Preis, Fix([GueltigVon]) AS Von, Fix([GueltigBis]) AS Bis" strSQL = strSQL & " FROM tblArtikel INNER JOIN tblPreise ON tblArtikel.ArtikelID = tblPreise.ArtikelID" strSQL = strSQL & " WHERE (((Fix([GueltigVon]))<=" & strDatum & ") AND ((Fix([GueltigBis]))>=" & strDatum & "));" Debug.Print strSQL End Sub
Listing 3: Einbetten von zuvor SQL-fähig gemachten Datumsangaben
Dazu formatieren wir das mit dem Parameter datDatum entgegengenommene Datum zuerst mit der Funktion SQLDatum und speichern das Ergebnis in der String-Variablen strDatum. Dieses fügen wir dann wie oben beschrieben in die SQL-Anweisung ein. Rufen wir die Prozedur dann mit einem Datum als Parameter auf, wird der vollständige SQL-Ausdruck im Direktbereich ausgegeben:
DatumInSQLEinbetten "8.3.2023"
Downloads zu diesem Beitrag
Enthaltene Beispieldateien:
DatumUndZeitMitAccess.accdb