Richtiges Datum für SQL

SQL ohne Übersetzung

All das ist aber eine „Leistung“ des Access-Abfrage-Editors. Ein SQL-Befehl wie in Listing 1 wird jedoch bei CurrentDB.Execute ohne Kontakt mit der Access-Oberfläche direkt von der Jet-Engine ausgeführt.

Es ist daher sinnvoll, eine kleine Funktion zu schreiben, welche ein Datum im amerikanischen Format liefert. Listing 2 zeigt einen ersten Versuch. Die Doppelkreuze werden der Einfachheit halber dabei direkt mit angefügt.

Function SQLDatum(datQuelle As Date) As String
SQLDatum = "#" & Format(datQuelle, "MM/dd/yyyy") & "#"
End Function
Sub Test()
Const datTest = #3/5/2006#
MsgBox SQLDatum(datTest) & vbCrLf & _
"Monat: " & Month(datTest)
End Sub

Hoppla, haben Sie das mal getestet? Obwohl die Format-Anweisung scheinbar eindeutig aussieht, erhalten Sie keineswegs #05/03/2006# als Ergebnis, sondern #03.05.2006# mit Punkten dazwischen. Tatsächlich ist der Schrägstrich kein Literal, also das Zeichen selbst, sondern der Stell- vertreter für das Datumstrennzeichen aus der Systemsteuerung. Damit er ein Literal wird und wirklich als Schrägstrich erscheint, stellen Sie ihm einen Backslash voran, wie in Listing 3 zu sehen ist.

Function SQLDatum(datQuelle As Date) As String
SQLDatum = "#" & Format(datQuelle, "MM\/dd\/yyyy") & "#"
End Functi

Jetzt können Sie in allen SQL-Statements wie in Listing 4 jedes Datum mit dieser Funktion kapseln. Bei Bedarf lässt sich die Funktion auch so erweitern, dass die Uhrzeit mit angezeigt wird.

Sub LoescheAltdaten()
Dim datVon As Date
Dim datBis As Date
Dim strSQL As String
datVon = #12/24/2005#
datBis = Date - 14
strSQL = "DELETE * FROM [Bestellungen] WHERE " & _
([Bestelldatum] >= " & _
SQLDatum(datVon) & " AND [Bestelldatum] <= " & _
SQLDatum(datBis) & ")"
MsgBox strSQL
'CurrentDb.Execute strSQL
End Sub