Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Konvertierung fehlgeschlagen beim Konvertieren von Datum und/oder Uhrzeit aus einer Zeichenkette beim Einfügen von datetime

Es gibt viele Formate, die von SQL Server unterstützt werden – siehe die MSDN-Onlinedokumentation zu CAST und CONVERT. Die meisten dieser Formate sind abhängig davon ab, welche Einstellungen Sie haben - daher können diese Einstellungen manchmal funktionieren - und manchmal nicht.

Um dies zu lösen, verwenden Sie das (leicht angepasste) ISO-8601-Datumsformat das von SQL Server unterstützt wird - dieses Format funktioniert immer - unabhängig von Ihren SQL Server-Sprach- und Datumsformateinstellungen.

Das ISO-8601-Format wird von SQL Server in zwei Varianten unterstützt:

  • YYYYMMDD für nur Daten (kein Zeitanteil); hier beachten:keine Bindestriche! , das ist sehr wichtig! YYYY-MM-DD ist NICHT unabhängig von den Datumsformat-Einstellungen in Ihrem SQL Server und NICHT Arbeit in allen Situationen!

oder:

  • YYYY-MM-DDTHH:MM:SS für Datum und Uhrzeit - hier beachten:Dieses Format hat Bindestriche (aber sie können weggelassen werden) und ein festes T als Trennzeichen zwischen dem Datums- und Uhrzeitteil Ihres DATETIME .

Dies gilt für SQL Server 2000 und neuer.

Verwenden Sie in Ihrem speziellen Fall also diese Zeichenfolgen:

insert into table1 values('2012-02-21T18:10:00', '2012-01-01T00:00:00');

und Sie sollten in Ordnung sein (Hinweis:Sie müssen die internationale 24-Stunden- verwenden Format anstelle des 12-Stunden-AM/PM-Formats).

Alternativ :wenn Sie SQL Server 2008 verwenden oder neuer, könnten Sie auch den DATETIME2 verwenden Datentyp (statt einfach DATETIME ) und Ihr aktuelles INSERT würde einfach ohne probleme funktionieren! :-) DATETIME2 ist viel besser und viel weniger wählerisch bei Konvertierungen - und es sind sowieso die empfohlenen Datums-/Zeitdatentypen für SQL Server 2008 oder neuer.

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  

Fragt mich nicht, warum dieses ganze Thema so verzwickt und etwas verwirrend ist – es ist einfach so. Aber mit dem YYYYMMDD format, sollten Sie für jede Version von SQL Server und für jede Sprach- und Datumsformateinstellung in Ihrem SQL Server geeignet sein.