2013-03-09 16 views
7

Ich habe eine Reihe von Terminen in varchar wie folgt aus:Convert YYYYMMDD zu DATUM

20080107 
20090101 
20100405 
... 

Wie kann ich sie in ein Datumsformat wie folgt konvertieren:

2008-01-07 
2009-01-01 
2010-04-05 

Ich habe versucht, mit diesem :

SELECT [FIRST_NAME] 
     ,[MIDDLE_NAME] 
     ,[LAST_NAME]  
     ,cast([GRADUATION_DATE] as date)  
    FROM mydb 

Aber diese Nachricht erhalten:

Nachricht 241, Ebene 16, Status 1, Zeile 2
Konvertierung fehlgeschlagen, wenn Datum und/oder Uhrzeit aus Zeichenkette konvertiert werden.

+0

Hmmm .. ein littleconfused. Wird diese Konvertierung nicht automatisch durchgeführt? – Coffee

+0

versuchen SELECT CONVERT (DATETIME, '20080107') – pavanred

+0

@Aaron Bertrand - Ich verstehe Ihren Standpunkt. –

Antwort

16

Der Fehler tritt auf, weil Sie (oder wer auch immer diese Tabelle entworfen hat) have a bunch of dates in VARCHAR. Warum speichern Sie (oder wer auch immer diese Tabelle entworfen hat) Daten als Zeichenfolgen? Haben Sie (oder wer auch immer diese Tabelle entworfen hat) auch Gehalt und Preise und Entfernungen als Strings gespeichert?

Um die Werte zu finden, die Probleme verursachen (so dass Sie (oder wer auch immer diese Tabelle entworfen) kann sie beheben):

SELECT GRADUATION_DATE FROM mydb 
    WHERE ISDATE(GRADUATION_DATE) = 0; 

Bet haben Sie mindestens eine Zeile. Fix diese Werte und dann FIX THE TABLE. Oder fragen Sie, wer den Tisch entworfen hat, um den Tisch zu reparieren. Wirklich nett.

ALTER TABLE mydb ALTER COLUMN GRADUATION_DATE DATE; 

Jetzt müssen Sie sich nicht um die Formatierung Sorge - Sie immer als YYYYMMDD oder YYYY-MM-DD auf dem Client formatiert werden kann, oder mit CONVERT in SQL. Wenn Sie ein gültiges Datum als Stringliteral haben, können Sie verwenden:

SELECT CONVERT(CHAR(10), '20120101', 120); 

... aber besser auf dem Client ausgeführt wird (wenn überhaupt).

Es gibt einen beliebten Begriff - Müll in, Müll raus. Sie werden nie in der Lage sein, in ein Datum zu konvertieren (egal, in einen String in einem bestimmten Format zu konvertieren), wenn Ihre Datentypauswahl (oder die Datentypauswahl desjenigen, der die Tabelle entworfen hat) inhärent Müll in Ihrer Tabelle zulässt . Bitte repariere es. Oder fragen Sie, wer auch immer den Tisch entworfen hat (nochmal, wirklich schön), um es zu reparieren.

+0

Sie haben Recht, es gab einige fehlende Werte, die ich nicht in der Mitte des Tisches gesehen habe. Danke, dass du mich an die 'isdate()' Funktion erinnert hast. – screechOwl

+6

Ich sehe dies die ganze Zeit mit Mainframe-Daten. Db2 für iSeries/AS400. Der Post ist eine Art von Rant, der davon ausgeht, dass der Benutzer die Kontrolle über den Umgang mit Datumsangaben als Zeichenfolgen hat. Zu viel Tadel, nicht genug Antwort. – smoore4

+1

@SQLDBA Ich muss verpasst haben, wo die OP - die vor zwei Jahren diese Antwort akzeptiert haben - angegeben hat, dass sie Mainframe-Daten verwenden, die sie nicht ändern können. Wenn es Mainframe-Daten sind, die sie nicht ändern können, wo ist Ihre Antwort darüber, wie Sie das lösen können? Wenn der Mainframe "20130232" gespeichert hat, können Sie mehr Antwort, weniger Rage liefern? –

6

Verwenden SELECT CONVERT(date, '20140327')

In Ihrem Fall

SELECT [FIRST_NAME], 
     [MIDDLE_NAME], 
     [LAST_NAME], 
     CONVERT(date, [GRADUATION_DATE])  
FROM mydb 
-1

In Ihrem Fall sollte es sein: hier

Select convert(datetime,convert(varchar(10),GRADUATION_DATE,120)) as 
'GRADUATION_DATE' from mydb 
+0

Danke, es hat für mich in Frau SQl 2005 funktioniert –