it-swarm.com.de

Konvertieren Sie varchar in datetime in SQL Server

Wie konvertiere ich eine Zeichenfolge des Formats mmddyyyy in datetime in SQL Server 2008?

Meine Zielspalte befindet sich in DateTime

Ich habe es mit Convert und den meisten Date -Stilwerten versucht, es wird jedoch eine Fehlermeldung angezeigt:

'Die Konvertierung eines varchar-Datentyps in einen datetime-Datentyp führte zu einem Wert außerhalb des Bereichs.'

62
Developer

OP will mmddyy und ein einfacher Konverter wird dafür nicht funktionieren:

select convert(datetime,'12312009')

Msg 242, Level 16, State 3, Line 1 
The conversion of a char data type to a datetime data type resulted in 
an out-of-range datetime value

also versuche folgendes:

DECLARE @Date char(8)
set @Date='12312009'
SELECT CONVERT(datetime,RIGHT(@Date,4)+LEFT(@Date,2)+SUBSTRING(@Date,3,2))

AUSGABE:

-----------------------
2009-12-31 00:00:00.000

(1 row(s) affected)
72
KM.

SQL Server kann implizit Zeichenfolgen in der Form 'JJJJMMTT' in eine Datums-/Uhrzeitangabe umwandeln. Alle anderen Zeichenfolgen müssen explizit umgewandelt werden. Hier sind zwei kurze Codeblöcke, die die Konvertierung von dem Formular durchführen, von dem Sie sprechen:

version 1 verwendet Einheitsvariablen:

BEGIN 
DECLARE @input VARCHAR(8), @mon CHAR(2), 
@day char(2), @year char(4), @output DATETIME

SET @input = '10022009'   --today's date


SELECT @mon = LEFT(@input, 2), @day = SUBSTRING(@input, 3,2), @year = RIGHT(@input,4)

SELECT @output = @[email protected][email protected] 
SELECT @output 
END

version 2 verwendet keine Einheitenvariablen:

BEGIN 
DECLARE @input CHAR(8), @output DATETIME
SET @input = '10022009' --today's date 

SELECT @output = RIGHT(@input,4) + SUBSTRING(@input, 3,2) + LEFT(@input, 2)

SELECT @output
END

In beiden Fällen muss der SQL Server diese implizite Konvertierung ausführen können.

7
nick

Ich fand das hilfreich für meine Konvertierung, ohne Zeichenkettenmanipulation. https://docs.Microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql

CONVERT(VARCHAR(23), @lastUploadEndDate, 121)

jjjj-mm-tt hh: mi: ss.mmm (24h) war das Format, das ich brauchte.

5
Stephen Himes

Wahrscheinlich haben Sie schlechte Daten, die nicht konvertiert werden können. Daten sollten niemals in varchar gespeichert werden, da dies Daten wie ASAP oder den 30.02.2009 ermöglicht. Verwenden Sie die Funktion isdate () für Ihre Daten, um die Datensätze zu finden, die nicht konvertiert werden können.

OK, ich habe mit bekannten guten Daten getestet und trotzdem die Nachricht erhalten. Sie müssen in ein anderes Format konvertieren, da nicht bekannt ist, ob es sich bei 12302009 um mmddyyyy oder ddmmyyyy handelt. Das Format von yyyymmdd ist nicht mehrdeutig und wird von SQL Server korrekt konvertiert

Ich habe das zum Laufen gebracht:

cast( right(@date,4) + left(@date,4) as datetime)

Es wird jedoch weiterhin eine Fehlermeldung angezeigt, wenn Sie eine Fehlermeldung in einem nicht standardmäßigen Format wie '112009' oder einem Textwert oder einem Datum außerhalb des gültigen Bereichs haben.

4
HLGEM

Konvertieren wäre die normale Antwort, aber das Format ist kein anerkanntes Format für den Konverter. MM/TT/JJJJ könnte mithilfe von Konvertieren konvertiert werden (datetime, yourdatestring, 101), aber Sie haben dieses Format nicht, sodass es fehlschlägt.

Das Problem ist, dass das Format nicht dem Standard entspricht. Sie müssen es in einen Standard ändern, den die Konvertierung anhand der verfügbaren Standards verstehen kann.

Zusammen gehackt, wenn Sie das Format garantieren können

declare @date char(8)
set @date = '12312009'
select convert(datetime, substring(@date,5,4) + substring(@date,1,2) + substring(@date,3,2),112)
4
Andrew

Schauen Sie sich CAST/CONVERT in BOL an, das sollte ein Anfang sein.

Wenn Ihre Zielspalte datetime ist, müssen Sie sie nicht konvertieren, SQL erledigt dies für Sie.

Andernfalls

CONVERT(datetime, '20090101')

Sollte es tun.

Dies ist ein link das auch helfen sollte:

3
JonH

Ich würde STUFF verwenden, um Trennzeichen einzufügen, und dann CONVERT mit dem entsprechenden Stil verwenden. Etwas wie das:

DECLARE @dt VARCHAR(100)='111290';
SELECT CONVERT(DATETIME,STUFF(STUFF(@dt,3,0,'/'),6,0,'/'),3)

Zuerst verwenden Sie zweimal STUFF, um 11/12/90 anstelle von 111290 zu erhalten, dann verwenden Sie 3 , um dies in datetime (oder jedes andere passende Format: benutze . für deutsch, - für Briten ...) Weitere Details zu CAST and CONVERT

Am besten war es, Datums- und Zeitwerte richtig zu speichern.

  • Dies sollte entweder "universelles, nicht getrenntes Format" sein yyyyMMdd
  • oder (besonders in XML) sollte es ISO8601 sein: yyyy-MM-dd oder yyyy-MM-ddThh:mm:ssWeitere Details zu ISO8601

Jedes kulturspezifische Format wird früher oder später zu Problemen führen ...

2
Shnugo

Ich hatte Glück mit etwas ähnlichem:

Convert(DATETIME, CONVERT(VARCHAR(2), @Month) + '/' + CONVERT(VARCHAR(2), @Day)
+ '/' + CONVERT(VARCHAR(4), @Year))
1
Ryan

use Try_Convert: Gibt bei erfolgreicher Umwandlung einen Wert zurück, der in den angegebenen Datentyp umgewandelt wurde. Andernfalls wird null zurückgegeben.

DECLARE @DateString VARCHAR(10) ='20160805'
SELECT TRY_CONVERT(DATETIME,@DateString)

SET @DateString ='Invalid Date'
SELECT TRY_CONVERT(DATETIME,@DateString)

Verknüpfung: MSDN TRY_CONVERT (Transact-SQL)

1
Shahab J

Dies scheint der einfachste Weg zu sein.

SELECT REPLACE(CONVERT(CHAR(10), GETDATE(), 110),'-','')
0
Daniel Folz

Ich denke, CONVERT ist die beste Wahl, da Sie einen Stil (Datumsformat) einschließen können, so dass der USA-Standard 110 ist, der MM-TT-JJJJ ist.

0
Kevin Horgan

SQL-Standarddaten beim Einfügen oder Aktualisieren Müssen zwischen dem 1.1.1753, 00:00 Uhr und dem 31.12.9999, 23:59:59 Uhr liegen.

Wenn Sie also weniger als den 1.1.1753 einfügen/aktualisieren, wird dieser Fehler angezeigt.

0

Die Hauptursache für dieses Problem kann in den regionalen Einstellungen liegen - DB wartet auf JJJJ-MM-TT, während eine App z. B. TT-MM-JJJJ (russisches Gebietsschema-Format) sendet, wie in meinem Fall. Ich habe nur das Format der Ländereinstellung von Russisch auf Englisch (USA) und voilà geändert.

0
Denis Maslov