Ich habe versucht, eine Tabelle wie folgt zu erstellen,
create table table1(date1 datetime,date2 datetime);
Zuerst habe ich versucht, Werte wie unten einzufügen,
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Es wurde eine Fehlermeldung ausgegeben,
Kann varchar nicht in datetime konvertieren
Dann habe ich versucht, unten Format als einer der Beitrag von unserem Stackoverflow vorgeschlagen,
insert into table1 values(convert(datetime,'21-02-2012 6:10:00 PM',5)
,convert(datetime,'01-01-2001 12:00:00 AM',5));
Aber ich bekomme immer noch die Fehlermeldung,
Konvertierung von Datum und/oder Uhrzeit aus Zeichenkette fehlgeschlagen
Irgendwelche Vorschläge?
Es gibt viele von SQL Server unterstützte Formate - siehe die MSDN Books Online on CAST and CONVERT. Die meisten dieser Formate sind abhängig von den Einstellungen, die Sie haben - daher können diese Einstellungen manchmal funktionieren und manchmal nicht.
Die Lösung für dieses Problem ist die Verwendung des (leicht angepassten) ISO-8601 Datumsformats, das von SQL Server unterstützt wird - dieses Format funktioniert immer - unabhängig von Ihren SQL Server Sprach- und Datumsformateinstellungen.
Das ISO-8601-Format, das von SQL Server unterstützt wird, gibt es in zwei Ausprägungen:
YYYYMMDD
für reine Datumsangaben (ohne Zeitanteil); beachten Sie hier: keine Bindestriche!, das ist sehr wichtig! JJJJ-MM-TT" ist NICHT unabhängig von den Datumsformateinstellungen in Ihrem SQL Server und wird NICHT in allen Situationen funktionieren!oder:
YYYY-MM-DDTHH:MM:SS
für Datums- und Zeitangaben - hier ist zu beachten: dieses Format hat Bindestriche (aber sie können weggelassen werden) und ein festes T
als Trennzeichen zwischen dem Datums- und Zeitteil Ihrer DATETIME
.Dies gilt für SQL Server 2000 und neuere Versionen.
In Ihrem konkreten Fall sollten Sie also diese Zeichenketten verwenden:
insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');
und es sollte alles in Ordnung sein (Hinweis: Sie müssen dafür das internationale 24-Stunden-Format und nicht das 12-Stunden-AM/PM-Format verwenden).
Alternativ: Wenn Sie SQL Server 2008 oder neuer verwenden, können Sie auch den Datentyp DATETIME2
verwenden (anstelle von einfachem DATETIME
) und Ihr aktuelles INSERT
würde ohne Probleme funktionieren! :-) DATETIME2" ist viel besser und weniger pingelig bei Konvertierungen - und es ist sowieso der empfohlene Datum/Zeit-Datentyp für SQL Server 2008 oder neuere Versionen.
SELECT
CAST('02-21-2012 6:10:00 PM' AS DATETIME2), -- works just fine
CAST('01-01-2012 12:00:00 AM' AS DATETIME2) -- works just fine
Fragen Sie mich nicht, warum dieses ganze Thema so knifflig und etwas verwirrend ist - so ist es nun einmal. Aber mit dem Format "JJJJMMTT" sollten Sie für jede Version von SQL Server und für jede Sprache und Datumsformateinstellung in Ihrem SQL Server gut zurechtkommen.
Die Konvertierung in SQL Server scheitert manchmal nicht an den verwendeten Datums- oder Zeitformaten, sondern lediglich daran, dass Sie versuchen, falsche Daten zu speichern, die für das System nicht akzeptabel sind.
Beispiel:
"Tabelle MyTable (MyDate) erstellen".
Einfügen in MeineTabelle(MeinDatum) Werte ('2015-02-29');`
Der SQL-Server gibt den folgenden Fehler aus:
Konvertierung fehlgeschlagen bei der Konvertierung von Datum und/oder Uhrzeit aus einer Zeichenkette.
Der Grund für diesen Fehler ist einfach, dass es kein solches Datum (29. Februar) im Jahr (2015) gibt.
Einfache Antwort: 5 ist italienisch "yy" und 105 ist italienisch "yyyy". Daher:
SELECT convert(datetime,'21-02-12 6:10:00 PM',5)
korrekt funktionieren, aber
SELECT convert(datetime,'21-02-12 6:10:00 PM',105)
gibt einen Fehler.
Gleichermaßen,
SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)
einen Fehler, während
SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)
funktionieren wird.