Ich habe versucht, eine Tabelle wie folgt zu erstellen:
create table table1(date1 datetime,date2 datetime);
Zuerst habe ich versucht, Werte wie folgt einzufügen:
insert into table1 values('21-02-2012 6:10:00 PM','01-01-2001 12:00:00 AM');
Es hat Fehler gegeben zu sagen:
Varchar kann nicht in datetime konvertiert werden
Dann habe ich das folgende Format als einen der von unserem Stackoverflow vorgeschlagenen Beiträge ausprobiert.
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 den Fehler zu sagen:
Die Konvertierung ist beim Konvertieren von Datum und / oder Uhrzeit aus der Zeichenfolge fehlgeschlagen
Irgendwelche Vorschläge?
sql
sql-server
Mari
quelle
quelle
Antworten:
Es gibt viele Formate, die von SQL Server unterstützt werden - siehe die MSDN Books Online zu CAST und CONVERT . Die meisten dieser Formate hängen davon ab, welche Einstellungen Sie haben - daher funktionieren diese Einstellungen manchmal - und manchmal auch 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 Ihrer SQL Server-Sprache und den Datumsformateinstellungen.
Das von SQL Server unterstützte ISO-8601-Format gibt es in zwei Varianten:
YYYYMMDD
für nur Daten (kein Zeitanteil); Beachten Sie hier: keine Striche! , das ist sehr wichtig!YYYY-MM-DD
ist NICHT unabhängig von den Datumsformateinstellungen in Ihrem SQL Server und funktioniert NICHT in allen Situationen!oder:
YYYY-MM-DDTHH:MM:SS
Termine und Zeiten - Anmerkung hier: Dieses Format hat Striche (aber sie können weggelassen werden), und ein FestT
als Trennzeichen zwischen dem Datum und der Zeit Teil IhrerDATETIME
.Dies gilt für SQL Server 2000 und höher.
Verwenden Sie in Ihrem konkreten Fall die folgenden Zeichenfolgen:
und es sollte Ihnen gut gehen (Hinweis: Sie müssen hierfür das internationale 24-Stunden- Format anstelle des 12-Stunden-AM / PM-Formats verwenden).
Alternativ : Wenn Sie mit SQL Server 2008 oder neuer arbeiten, können Sie auch den
DATETIME2
Datentyp (anstelle von normalDATETIME
) verwenden, und Ihr aktueller DatentypINSERT
funktioniert problemlos! :-)DATETIME2
ist viel besser und bei Konvertierungen viel weniger wählerisch - und es sind sowieso die empfohlenen Datums- / Zeitdatentypen für SQL Server 2008 oder neuer.Fragen Sie mich nicht, warum dieses ganze Thema so knifflig und etwas verwirrend ist - so ist es eben. Mit dem
YYYYMMDD
Format sollten Sie jedoch für jede Version von SQL Server und für jede Sprach- und Datumsformateinstellung in Ihrem SQL Server in Ordnung sein.quelle
Die Konvertierung in SQL Server schlägt manchmal nicht aufgrund der verwendeten Datums- oder Uhrzeitformate fehl. Dies liegt lediglich daran, dass Sie versuchen, falsche Daten zu speichern, die für das System nicht akzeptabel sind.
Beispiel:
Create Table MyTable (MyDate);
Insert Into MyTable(MyDate) Values ('2015-02-29');
Der SQL Server gibt den folgenden Fehler aus:
Conversion failed when converting date and/or time from character string.
Der Grund für diesen Fehler ist einfach, dass es im Jahr (2015) kein solches Datum (29. Februar) gibt.
quelle
Einfache Antwort - 5 ist italienisch "yy" und 105 ist italienisch "yyyy". Deshalb:
wird richtig funktionieren, aber
wird Fehler geben.
Gleichfalls,
wird Fehler geben, wo als
wird funktionieren.
quelle
Aktualisieren Sie einfach das Datumsformat wie unten
Es löst das Problem für mich und es funktioniert gut
quelle
DATEFORMAT
. Überprüfen Sie dies, indem Sie ausführenSET DATEFORMAT MDY;SELECT CAST('2017-08-07 00:00:00' AS datetime); SET DATEFORMAT DMY;SELECT CAST('2017-08-07 00:00:00' AS datetime);
. Es funktioniert zuverlässig, wenn Sie einT
Trennzeichen (yyyy-MM-ddTHH:mm:ss
) hinzufügen .Wann immer möglich , sollte man kulturspezifische Datums- / Zeitliterale vermeiden .
Es gibt einige sichere Formate, um Datum und Uhrzeit als Literal anzugeben:
Alle Beispiele für
2016-09-15 17:30:00
ODBC (mein Favorit, da es sofort als der echte Typ behandelt wird)
{ts'2016-09-15 17:30:00'}
- Zeitstempel{d'2016-09-15'}
- Nur Datum{t'17:30:00'}
- Nur ZeitISO8601 (das Beste für überall )
'2016-09-15T17:30:00'
- Sei dirT
der Mitte bewusst !Nicht getrennt (winziges Risiko, als Zahl falsch interpretiert zu werden)
'20160915'
- Nur für reines DatumGut zu beachten: Ungültige Daten werden häufig mit seltsamen Fehlern angezeigt
Ein Grund mehr für seltsame Konvertierungsfehler: Ausführungsreihenfolge!
SQL-Server ist bekannt dafür, Dinge in einer Reihenfolge auszuführen, die man vielleicht nicht erwartet hätte. Ihre schriftliche Erklärung sieht so aus, als ob die Konvertierung zuvor durchgeführt wurde eine typbezogene Aktion ausgeführt wird, aber die Engine entscheidet - warum auch immer -, die Konvertierung in einem späteren Schritt durchzuführen.
Hier ist ein großartiger Artikel, der dies anhand von Beispielen erklärt: Rusano.com: "t-sql-Funktionen-implizieren keine bestimmte Ausführungsreihenfolge" und hier ist die verwandte Frage .
quelle
Der beste Weg ist dieser Code
quelle
quelle
Das Datum / Uhrzeit-Format, das tatsächlich auf einem SQL Server ausgeführt wird, ist
quelle
m
undM
). Lesen Sie den Kommentar von Dan Guzman zu Pronab Roys Antwort. Und lesen Sie die anderen Antworten hier ...Bitte versuchen Sie dies.
SQL Server erwartet Datumsangaben im Format MM / TT / JJJJ. Wenn Englisch als Standardsprache festgelegt ist. Hier wird der Datumsauswahlwert in der Datenbank sql2008 gespeichert. Mein Feldtyp ist datetime in database.dpdob ist mein Datumsauswahlname.
Verwenden Sie nun dob in Ihrer Einfügeabfrage.
quelle
Sie können diesen Code ausprobieren
quelle
Ich hatte dieses Problem, als ich versuchte,
getdate()
eine Zeichenfolge zu verketten , die ich in ein nvarchar-Feld einfügte.Ich habe ein Casting gemacht, um das zu umgehen:
Das ist ein bereinigtes Beispiel. Der Schlüsselteil davon ist:
...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...
Wirkte das Datum als
datetime2
, um es dannnvarchar
zu verketten.quelle
Ich habe es versucht und es funktioniert mit mir:
quelle
Setzen Sie Culture aus der Datei web.config auf Englisch
Wenn Sie beispielsweise die Kultur auf Arabisch einstellen, wird der Thime sein
22/09/2017 02:16:57 ص
und Sie erhalten die Fehlermeldung: Die Konvertierung ist fehlgeschlagen, wenn Datum und / oder Uhrzeit aus der Zeichenfolge beim Einfügen von Datum / Uhrzeit konvertiert wurden
quelle
So konvertieren Sie einfach von einer ISO-Zeichenfolge in einen SQL-Server
datetime
:Quelle https://www.sqlservercurry.com/2010/04/convert-character-string-iso-date-to.html
quelle
Bei mir hat das geklappt:
quelle