Die Konvertierung ist fehlgeschlagen, wenn Datum und / oder Uhrzeit aus der Zeichenfolge beim Einfügen von Datum / Uhrzeit konvertiert wurden

164

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?

Mari
quelle
2
@Damien_The_Unbeliever Wie Sie sagten, habe ich diesen Beitrag bereits auf stackoverflow.com/questions/12957635/… verwiesen, bevor ich diese Frage gestellt habe. Sie baten uns, 'insert table1 (genehmigen) Werte zu verwenden (convert (datetime, '18 -06-12 10:34:09 PM', 5)); ' aber es funktioniert nicht
Mari

Antworten:

163

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:

  • YYYYMMDDfür nur Daten (kein Zeitanteil); Beachten Sie hier: keine Striche! , das ist sehr wichtig! YYYY-MM-DDist NICHT unabhängig von den Datumsformateinstellungen in Ihrem SQL Server und funktioniert NICHT in allen Situationen!

oder:

  • YYYY-MM-DDTHH:MM:SSTermine und Zeiten - Anmerkung hier: Dieses Format hat Striche (aber sie können weggelassen werden), und ein Fest Tals Trennzeichen zwischen dem Datum und der Zeit Teil Ihrer DATETIME.

Dies gilt für SQL Server 2000 und höher.

Verwenden Sie in Ihrem konkreten Fall die folgenden Zeichenfolgen:

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

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 DATETIME2Datentyp (anstelle von normal DATETIME) verwenden, und Ihr aktueller Datentyp INSERTfunktioniert problemlos! :-) DATETIME2ist viel besser und bei Konvertierungen viel weniger wählerisch - 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  

Fragen Sie mich nicht, warum dieses ganze Thema so knifflig und etwas verwirrend ist - so ist es eben. Mit dem YYYYMMDDFormat sollten Sie jedoch für jede Version von SQL Server und für jede Sprach- und Datumsformateinstellung in Ihrem SQL Server in Ordnung sein.

marc_s
quelle
1
Nur als Hinweis funktioniert das Casting als DATETIME2 auch mit 'JJJJ-MM-TTTHH: MM: SSZ' (Anmerkung 'Z' - Zulu-Zeit am Ende, um den UTC-Zeitstempel zu kennzeichnen). Ich habe diesen Fehler beim Versuch, '2013-12-16T17: 21: 26Z' in das Datum / Uhrzeit-Feld einzufügen. Zur Verdeutlichung wird ISO 8601 teilweise unterstützt. Zulu-Zeit wird nicht unterstützt, obwohl dies in der Dokumentation erwähnt wird. Es ist wahrscheinlich eine Einstellung, für die ich keine Zeit hatte herauszufinden, aber falls jemand das gleiche Problem hat, denken Sie daran.
Michał
3
Ich kann bestätigen, dass das Datumsformat 'JJJJMMTT' einwandfrei funktioniert. Ich habe es unter SQL Server 2014 versucht, um ein Literaldatum in einer WHERE-Klausel anzugeben. Viele Panzer zu @marc_s
Giorgio Barchiesi
1
Das DATETIME2-Ding hat bei mir funktioniert. In meinem Fall habe ich ein Datenbankskript von einem SQLServer in Englisch in eine spanische Version davon importiert, also immer den gleichen Fehler. Ich habe im Skript einfach alle "as DATETIME" -Währungen durch "as DATETIME2" ersetzt und das Problem gelöst.
Alejandro del Río
24

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.

Ashraf Abusada
quelle
2
"Der Grund für diesen Fehler ist einfach, dass es im Jahr (2015) kein solches Datum (29. Februar) gibt." Genau aus diesem Grund habe ich diesen Fehler erhalten. Diese Antwort berücksichtigt die häufigste Ursache für diesen Fehler, die andere Antwort nicht.
FirstFraktal
1
Ich habe Daten aus einer Excel-Tabelle importiert, in der die Nullwerte tatsächlich "NULL" in der Zelle hatten. Dies wurde in der DB-Tabelle als Zeichenfolge "Null" festgelegt, sodass versucht wurde, die Zeichenfolge "Null" in eine Datums- / Uhrzeitangabe zu konvertieren. Sollte die "NULL" -Zellen in Excel geleert haben. Ich bin ein Idiot: /
Karol
17

Einfache Antwort - 5 ist italienisch "yy" und 105 ist italienisch "yyyy". Deshalb:

SELECT convert(datetime,'21-02-12 6:10:00 PM',5)

wird richtig funktionieren, aber

SELECT convert(datetime,'21-02-12 6:10:00 PM',105)

wird Fehler geben.

Gleichfalls,

SELECT convert(datetime,'21-02-2012 6:10:00 PM',5)

wird Fehler geben, wo als

SELECT convert(datetime,'21-02-2012 6:10:00 PM',105)

wird funktionieren.

Raj
quelle
8

Aktualisieren Sie einfach das Datumsformat wie unten

yyyy-MM-dd hh:MM:ss

Es löst das Problem für mich und es funktioniert gut

Pronab Roy
quelle
2
Bitte lesen Sie die anderen bereits gegebenen Antworten. Dieses Format funktioniert nur aufgrund Ihrer Sitzungseinstellung DATEFORMAT. Überprüfen Sie dies, indem Sie ausführen SET 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 ein TTrennzeichen ( yyyy-MM-ddTHH:mm:ss) hinzufügen .
Dan Guzman
1
Vielen Dank, ja, Sie haben Recht, es löst mein Problem und ich habe die anderen Antworten hier gelesen
Pronab Roy
8

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 Zeit

ISO8601 (das Beste für überall )

  • '2016-09-15T17:30:00'- Sei dir Tder Mitte bewusst !

Nicht getrennt (winziges Risiko, als Zahl falsch interpretiert zu werden)

  • '20160915' - Nur für reines Datum

Gut zu beachten: Ungültige Daten werden häufig mit seltsamen Fehlern angezeigt

  • Es gibt keinen 31. Juni oder 30. Februar ...

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 .

Shnugo
quelle
3

Der beste Weg ist dieser Code

"select * from [table_1] where date between convert(date,'" + dateTimePicker1.Text + "',105) and convert(date,'" + dateTimePicker2.Text + "',105)"
Ahmed Soliman
quelle
2
convert(datetime2,((SUBSTRING( ISNULL(S2.FechaReal,e.ETA),7,4)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),4,2)+'-'+ SUBSTRING( ISNULL(S2.FechaReal,e.ETA),1,2) + ' 12:00:00.127')))  as fecha,
ARLE ANDINO
quelle
1
Wenn Sie Backticks anstelle von Anfangszeichen verwenden, erhalten Sie einen Zeilenumbruch.
Jesse W bei Z - Aufgegeben am SE
2

Das Datum / Uhrzeit-Format, das tatsächlich auf einem SQL Server ausgeführt wird, ist

yyyy-mm-dd hh:MM:ss
Bhavya Dhiman
quelle
1
Nein, das ist nicht wahr (abgesehen von der Nichtübereinstimmung von mund M). Lesen Sie den Kommentar von Dan Guzman zu Pronab Roys Antwort. Und lesen Sie die anderen Antworten hier ...
Shnugo
2

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.

           Dim test = dpdob.Text.Replace("-", "/")
           Dim parts As String() = test.Split(New Char() {"/"c})
           Dim firstPart As String = parts(0)
           Dim thirdPart As String = parts(2)
           Dim secondPart As String = parts(1)
           Dim test1 = secondPart + "/" + firstPart + "/" + thirdPart
           Dim dob = test1

Verwenden Sie nun dob in Ihrer Einfügeabfrage.

SwR
quelle
1

Sie können diesen Code ausprobieren

select (Convert(Date, '2018-04-01'))
Biddut
quelle
1

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:

 INSERT INTO [SYSTEM_TABLE] ([SYSTEM_PROP_TAG],[SYSTEM_PROP_VAL]) VALUES 
   (
    'EMAIL_HEADER',
    '<h2>111 Any St.<br />Anywhere, ST 11111</h2><br />' + 
        CAST(CAST(getdate() AS datetime2) AS nvarchar) + 
    '<br /><br /><br />'
   )

Das ist ein bereinigtes Beispiel. Der Schlüsselteil davon ist:

...' + CAST(CAST(getdate() AS datetime2) AS nvarchar) + '...

Wirkte das Datum als datetime2, um es dann nvarcharzu verketten.

vapcguy
quelle
1

Ich habe es versucht und es funktioniert mit mir:

SELECT CONVERT(date, yourDate ,104)
Abd Abughazaleh
quelle
0

Setzen Sie Culture aus der Datei web.config auf Englisch

  <globalization uiCulture="en-US" culture="en-US" />

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

Yusuf
quelle
0

Bei mir hat das geklappt:

INSERT INTO [MyTable]
           ([ValidFrom]
           ,[ValidTo])
       VALUES
           ('2020-01-27 14:54:11.000'
           ,'2023-01-27 14:52:50.000')
Joel Wiklund
quelle