BearbeitenProblem:
Benutzer soll ein Datum eingeben das dann etwa in einer SQL Query weiterverwendet wird. Beispiel als Kriterium (in der WHERE clause) oder als Datenbankinhalt. Häufiger Knackpunkt: in SQL Notation sieht ein Datum anders aus, als ich es in VBScript kriege.
BearbeitenBeispiele:
VBScript:
Datumskonstante #05/20/2003#
Formatiertiert Datumsausgabe auf deutschen System: 20.5.2003
Jet/Access:
Datumskonstante #05/20/2003#
Formatiertiert Datumsausgabe auf deutschen System: 20.5.2003
SQL Server:
Datumskonstante '20.5.2003'
Formatiertiert Datumsausgabe auf deutschen System: 20.5.2003
Sprich, wenn ich eine Datumskonstante brauche und eine formatierte Ausgabe (oder vom Benutzergemachte Eingabe) habe, wie komme ich zur passenden Umwandlung
Problem 2:Wie oben, aber das Script soll auch einfache Abkürzungen wie "morgen" oder "gestern" verstehen.
Lösungsvorschlag:Das unten stehende Script. Zum Ausprobieren was es alles kann, zum Anpassen und ggf. Feintunen kann man alles in eine test.vbs packen und dann mal laufen lassen.
Passt alles, dann
- . nur die 3 Funktionen in das eigene ASP Script übernehmen.
- . die Datenbank einstellen (ganz am Ende der ToDate-Function Kommentare entfernen/setzen - voreingestellt ist Jet/Access)
- . Aufruf/Verwendung könnte dann etwa so laufen
sqldatum = ToDate(request("datum_vom_formular"))
SQL = "SELECT a,b FROM tab WHERE eintrag > " & sqldatum
Hinweis: das Script produziert eine Datumsfunktion. Das ist zwar mehr Text zum Übertragen vom Script zur Datenbank ist aber performanter als eine Konstante zu übergeben. Und völlig unabhängig von irgendwelchen Ländereinstellungen.
Das Script ist ein bischen lang geraten. Es fängt eine Reihe von Fehleingaben ab. Und erlaubt so Dinge, wie morgen, erster (fuer Monatserster), etc. einzugeben. Kurzum es versucht halt krampfhaft aus der Usereingabe was passendes zu machen. Wo nix gscheites ankommt, werden die Daten des aktuellen Datums angenommen. Beispiel es wird nur 4 angegeben, dann kommt der 4. des aktuellen Monats dabei raus.
Option Explicit
dim a
a = "2.3.2000"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "22.3.2000"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "2.33.2000"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "2, 3 .2000"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "13. 13. 2000"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "13. 1"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "13. April"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "34 Dezemper"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "33/"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "4"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "3. Idiot"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "Letzder"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = " Morgen"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "geSCHDern "
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "Übermogen"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "Moin"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
a = "Hoppala"
msgbox a & vbcrlf & vbcrlf & ToDate(a)
Function ToDate(sString)
Dim i, a, sTemp, sTag, sMonat, sJahr
' -- alle möglichen Trennzeichen raus
sString = replace(replace(replace(replace(replace(sString, _
".", " "), _
"/", " "), _
",", " "), _
" ", " "), _
" ", " ")
' -- Defaults vorbelegen
sJahr = Year(Now)
sMonat = Month(Now)
sTag = Day(Now)
' -- jetzt Datum ermitteln
Select Case Left(Lcase(Trim(sString)), 3)
Case "heu", "jet" ' -- heute
' nix machen, ist schon passend vorbelegt
Case "mor", "moi" ' -- morgen
sTemp = Now + 1
sJahr = Year(sTemp)
sMonat = Month(sTemp)
sTag = Day(sTemp)
Case "ges" ' -- gestern
sTemp = Now - 1
sJahr = Year(sTemp)
sMonat = Month(sTemp)
sTag = Day(sTemp)
Case "übe" ' -- übermorgen
sTemp = Now + 2
sJahr = Year(sTemp)
sMonat = Month(sTemp)
sTag = Day(sTemp)
Case "ers" ' -- Monatserster
sTemp = DateSerial(Year(Now), Month(Now), 1)
sJahr = Year(sTemp)
sMonat = Month(sTemp)
sTag = Day(sTemp)
Case "let" ' -- Monatsletzter
sTemp = DateSerial(Year(Now), Month(Now) + 1, 1) - 1
sJahr = Year(sTemp)
sMonat = Month(sTemp)
sTag = Day(sTemp)
Case Else ' -- der Normalfall
a = split(sString, " ")
For i = 0 to UBound(a)
Select Case i
Case 0
sTag = Val(a(i))
if sTag = 0 Then sTag = Day(Now)
Case 1
sMonat = Val(a(i))
If sMonat = 0 Then sMonat = GetMonat(a(i))
Case 2
sJahr = Val(a(i))
If sJahr = 0 Then sJahr = Year(Now)
End Select
Next
End Select
' -- Variante A ein VBS Datum
' ToDate = DateSerial(sJahr, sMonat, sTag)
' -- Variante B ein Access (oder auch Excel, etc.) Datum generieren
sTemp = DateSerial(sJahr, sMonat, sTag)
ToDate = "DateSerial(" & Year(sTemp) & ", " & Month(sTemp) & ", " & Day(sTemp) & ")"
' -- Variante C ein SQL-Server Datum bauen
' sTemp = DateSerial(sJahr, sMonat, sTag)
' ToDate = "Convert(datetime, '" & Day(sTemp) & "." & Month(sTemp) & "." & Year(sTemp) & "', 104)"
End Function
'
' --- String Funktionen
'
Function Val(sString)
Dim i, a, sTemp
If IsNumeric(sString) Then
Val = CInt(sString)
Else
sTemp = "0"
For i = 1 to Len(sString)
a = mid(sString, i, 1)
If IsNumeric(a) Then sTemp = sTemp & a
Next
Val = CInt(sTemp)
End If
End Function
Function GetMonat(sString)
Select Case Left(Lcase(trim(sString)), 3)
Case "jan"
GetMonat = 1
Case "feb"
GetMonat = 2
Case "mär", "mar"
GetMonat = 3
Case "apr"
GetMonat = 4
Case "mai", "may"
GetMonat = 5
Case "jun"
GetMonat = 6
Case "jul"
GetMonat = 7
Case "aug"
GetMonat = 8
Case "sep"
GetMonat = 9
Case "okt", "oct"
GetMonat = 10
Case "nov"
GetMonat = 11
Case "dez", "dec"
GetMonat = 12
Case Else
GetMonat = Month(now)
End Select
End Function