Hallo Ulrich,
Ich habe inzwischen ein kleines Testprogramm
geschrieben, das den von 'Now' zurückgegebenen
Datumswert in eine Datumsfeld schreibt.
Now() liefert einen Wert vom Typ Variant, Untertyp Date.
Mit
Dim MeinDatum as Date
MeinDatum = now
hast Du in MeinDatum einen Wert vom Typ Date.
In welches Feld schreibst Du wie diesen Wert?
Ich habe diesen Datumswert über 'Cdbl' (VB)
bzw. 'ZDouble' (Access) jeweils in eine serielle
Zahl umgewandelt
Was meinst Du mit einer "seriellen Zahl"?
Mit
Dim dblValue as Double
dblValue = cDBL(Now)
steht in der Variablen dblValue nun ein Wert
vom Typ Double, bei dem der Wert vor dem
Dezimaltrenner die Anzahl der seit dem 30.12.1899
vergangenen Tage darstellt und der Teil hinter
dem Dezimaltrenner die Uhrzeit als Bruchteil eines
ganzen Tages von 24Std. darstellt. Der Wert 0,5
wäre also der 30. Dezember 1899 12Uhr Mittags.
und erhalte 2 verschiedene Werte.
Wie erhältst Du wo 2 verschiedene Werte?
Eine Rückfrage bei anderen Entwicklern ergab,
dass in Access statt Textfelder Datumsfelder
eingesetzt werden.
Wo werden in Access Datumsfelder statt Textfelder
eingesetzt?
Es ist Deine Entscheidung, ob Du für ein Feld in
einem Datensatz einer Tabelle einer *.mdb ein
Feld als Textfeld oder als Feld vom Typ Datum/Zeit
definierst.
Aber natürlich ist es sinnvoll, für das Speichern von
Datumswerten ein Feld vom Typ Datum/Zeit
(VB-Typ Date) zu verwenden, da Du nur so die bei
der Speicherung von Datumsausdrücken in Textfeldern
unumgänglichen Formatierungsprobleme bei
unterschiedlichen Ländereinstellungen umgehen
kannst.
Dies ist für mich nicht
aktzeptabel!
Was ist nicht akzeptabel?
Warum willst Du einen Wert vom Typ Date in einem
Textfeld in der DB speichern? Damit handelst Du
Dir nur völlig unnötige Probleme im Zusammenhang
mit unterschiedlichen Ländereinstellungen ein.
Das von Rainer vorgeschlagene CDate(Now)
funktioniert bei mir nicht,
Natürlich nicht.
cDate(Now) liefert wieder einen Wert vom Typ Date,
ist also hölzernes Holz.
Und so wie Du es verwendest, zwingst Du VB diesen
Wert in einem String umzuwandeln, was nach den
Formatierungsregeln der jeweiligen Ländereinstellung
geschieht. In Deinem Fall also mit einiger Wahrscheinlichkeit
nach Deutschen Formatierungsregeln. Einen derart
formatierten Datumsausdruck versteht aber die Jet-
Engine nicht, bzw. kann diesen in einer Reihe von
Fällen falsch interpretieren. Die Jet-Engine erwartet
bei Datumsausdrücken in Strings das US-Format
(mm/dd/yyyy) oder das ISO-Format (yyyy/mm/dd).
Das ISO-Format hat den Vorteil, dass es da kein
Vertun zwischen Monat und Tag geben kann, da
die JetEngine bei einem führenden Jahr in jedem
Fall weiss, dass der Rest Monat und dann Tag ist.
nur Format$(Now, "yyyy-mm-dd hh:mm:ss")
Ja, mit diesem Format (ISO) kann die Jet-Engine
einwandfrei arbeiten und es kann damit auch keine
Fehlinterpretationen geben.
und dabei belasse ich es auch, zumal
dieses Format der Norm (ISO 8601) entspricht.
Ja, so isses.
Nur hat das alles nichts damit zu tun, ob man ein
Datum in der DB als Wert vom Typ Date oder als
String speichert. In der DB solltest Du Deine
Datumswerte auf jeden Fall als Werte vom Typ
Date speichern. Ein solcher Wert ist völlig unabhängig
von irgendwelchen länderspezifischen Formatierungen.
Dagegen sind Datumsausdrücke in Strings immer mit
irgendwelchen (länderspezifischen) Formatierungen
behaftet und somit Probleme bei der Interpretation
solcher Ausdrücke schon vorprogrammiert.
Ich hoffe nur, dass ich solche Probleme mit C#
und ADO.NET zukünftig nicht mehr habe
Ich befürchte, dass Du diese Probleme auch damit
haben wirst, da Dir offenbar (noch) nicht klar ist, dass
ein Datum in einem Feld einer DB-Tabelle zwar als
Wert vom Typ Date gespeichert werden kann, ein
solches Datum jedoch in einem SQL-Statement,
welches ja in Form eines Strings erstellt wird, eben
zwangsläufig als String mit einem bestimmten (US-
oder ISO- Format) dargestellt werden muss.
Die konsequente Verwendung von Parameterobjekten
für Deine Commands erspart Dir dieses Umdenken
bzw. richtige Formatieren von Datumsausdrücken für
SQL-Strings, weil Du dem Parameterobjekt den
Datumswert typgerecht als Wert vom Typ Date übergeben
kannst.
Schau Dir zum Thema Datum in SQL-Strings vielleicht
auch mal die beiden Artikel unter
www.gssg.de -> Visual Basic -> VBclassic
-> Datum/Zeit
-> Datum u. Zeit in Visual Basic
-> Datum u. Zeit in SQL-Strings
an. Dort findest Du auch Dein ISO-Format wieder und
auch noch anderes, was die Jet-Engine als Datum
versteht.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)