AspGerman Wiki

Bearbeiten

Problem:

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.

Bearbeiten

Beispiele:

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

  1. . nur die 3 Funktionen in das eigene ASP Script übernehmen.
  2. . die Datenbank einstellen (ganz am Ende der ToDate-Function Kommentare entfernen/setzen - voreingestellt ist Jet/Access)
  3. . 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

ScrewTurn Wiki version 2.0.33. Some of the icons created by FamFamFam.