217 Stimmen

Sql Server String in Datum umwandeln

Ich möchte eine Zeichenkette wie diese konvertieren:

'10/15/2008 10:06:32 PM'

in den entsprechenden DATETIME-Wert in Sql Server.

Bei Oracle würde ich dies sagen:

TO_DATE('10/15/2008 10:06:32 PM','MM/DD/YYYY HH:MI:SS AM')

Diese Frage impliziert, dass ich die Zeichenkette in eine der folgenden Kategorien zerlegen muss Standardformate und konvertieren Sie dann mit einem dieser Codes. Das erscheint mir für einen so banalen Vorgang lächerlich. Gibt es einen einfacheren Weg?

0 Stimmen

0 Stimmen

Die Frage sollte so bearbeitet werden, dass sie eine allgemeinere Frage zur Konvertierung von einem erwarteten Eingabeformat in ein neues Ausgabeformat stellt. Und die Antworten würden dann nicht nur seine, sondern auch die Fragen aller anderen abdecken. Die Frage ist zwar implizit gestellt, sollte aber explizit gestellt werden. Um keine unnötige Diskussion über die eigentliche Frage zu verursachen.

350voto

gauravg Punkte 3416

Versuchen Sie dies

Cast('7/7/2011' as datetime)

y

Convert(DATETIME, '7/7/2011', 101)

Siehe CAST und CONVERT (Transact-SQL) für weitere Einzelheiten.

17 Stimmen

Dies ist die richtige Vorgehensweise und sollte als korrekte Antwort markiert werden. Beachten Sie, dass Cast('2011-07-07' as datetime) funktioniert ebenfalls und beseitigt die Unklarheit über die Reihenfolge von Monat und Tag.

1 Stimmen

Dies funktioniert nicht, wenn der Monat > 12 ist. Die Formatierung erwartet das Format mm/dd/yyyy

2 Stimmen

Verwenden Sie Convert(varchar(30),'7/7/2011',103) bei der Konvertierung von tt/mm/jjjj

58voto

Taptronic Punkte 5003

Lassen Sie dies durch Ihren Abfrageprozessor laufen. Er formatiert Datums- und/oder Zeitangaben wie folgt, und eine davon sollte Ihnen das liefern, wonach Sie suchen. Es wird nicht schwer sein, es anzupassen:

Declare @d datetime
select @d = getdate()

select @d as OriginalDate,
convert(varchar,@d,100) as ConvertedDate,
100 as FormatValue,
'mon dd yyyy hh:miAM (or PM)' as OutputFormat
union all
select @d,convert(varchar,@d,101),101,'mm/dd/yy'
union all
select @d,convert(varchar,@d,102),102,'yy.mm.dd'
union all
select @d,convert(varchar,@d,103),103,'dd/mm/yy'
union all
select @d,convert(varchar,@d,104),104,'dd.mm.yy'
union all
select @d,convert(varchar,@d,105),105,'dd-mm-yy'
union all
select @d,convert(varchar,@d,106),106,'dd mon yy'
union all
select @d,convert(varchar,@d,107),107,'Mon dd, yy'
union all
select @d,convert(varchar,@d,108),108,'hh:mm:ss'
union all
select @d,convert(varchar,@d,109),109,'mon dd yyyy hh:mi:ss:mmmAM (or PM)'
union all
select @d,convert(varchar,@d,110),110,'mm-dd-yy'
union all
select @d,convert(varchar,@d,111),111,'yy/mm/dd'
union all
select @d,convert(varchar,@d,12),12,'yymmdd'
union all
select @d,convert(varchar,@d,112),112,'yyyymmdd'
union all
select @d,convert(varchar,@d,113),113,'dd mon yyyy hh:mm:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,114),114,'hh:mi:ss:mmm(24h)'
union all
select @d,convert(varchar,@d,120),120,'yyyy-mm-dd hh:mi:ss(24h)'
union all
select @d,convert(varchar,@d,121),121,'yyyy-mm-dd hh:mi:ss.mmm(24h)'
union all
select @d,convert(varchar,@d,126),126,'yyyy-mm-dd Thh:mm:ss:mmm(no spaces)'

50voto

Aaron Bertrand Punkte 259330

In SQL Server Denali werden Sie in der Lage sein, etwas zu tun, das dem nahe kommt, wonach Sie suchen. Aber Sie können immer noch nicht einfach eine beliebige, verrückte Datumszeichenfolge übergeben und erwarten, dass SQL Server sich darauf einstellt. Hier ist ein Beispiel, das etwas verwendet, das Sie in Ihrer eigenen Antwort geschrieben haben. Die Funktion FORMAT() kann auch Gebietsschemata als optionales Argument akzeptieren - sie basiert auf dem Format von .Net, so dass die meisten, wenn nicht alle Token-Formate, die Sie erwarten würden, vorhanden sind.

DECLARE @d DATETIME = '2008-10-13 18:45:19';

-- returns Oct-13/2008 18:45:19:
SELECT FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss');

-- returns NULL if the conversion fails:
SELECT TRY_PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

-- returns an error if the conversion fails:
SELECT PARSE(FORMAT(@d, N'MMM-dd/yyyy HH:mm:ss') AS DATETIME);

Ich empfehle Ihnen dringend, Ihre Dateneingaben besser zu kontrollieren und zu bereinigen. Die Zeiten, in denen man Daten in einem beliebigen Format in ein Freitext-Formularfeld eingeben konnte, sollten längst vorbei sein. Wenn jemand 8/9/2011 eingibt, ist das dann der 9. August oder der 8. September? Wenn Sie den Benutzer dazu bringen, ein Datum in einem Kalendersteuerelement auszuwählen, kann die Anwendung das Format steuern. Egal, wie sehr Sie versuchen, das Verhalten Ihrer Benutzer vorherzusagen, sie werden immer einen dümmeren Weg finden, ein Datum einzugeben, den Sie nicht eingeplant haben.

Bis Denali, aber ich denke, dass @Ovidiu hat den besten Rat so weit ... dies kann ziemlich trivial durch die Implementierung Ihrer eigenen CLR-Funktion gemacht werden. Dann können Sie einen Fall/Switch für so viele verrückte Nicht-Standard-Formate schreiben, wie Sie wollen.


UPDATE für @dhergert :

SELECT TRY_PARSE('10/15/2008 10:06:32 PM' AS DATETIME USING 'en-us');
SELECT TRY_PARSE('15/10/2008 10:06:32 PM' AS DATETIME USING 'en-gb');

Ergebnisse:

2008-10-15 22:06:32.000
2008-10-15 22:06:32.000

Die anderen wichtigen Informationen müssen Sie aber erst einmal haben. Sie können kein natives T-SQL verwenden, um festzustellen, ob 6/9/2012 ist der 9. Juni oder der 6. September.

3 Stimmen

Ich glaube, die Frage war, wie man eine Zeichenkette in ein Datum umwandelt, nicht ein Datum in eine Zeichenkette.

1 Stimmen

TRY_PARSE war perfekt. Wir hatten ein Problem mit dem Parsen eines Datums "Thu Sep 22 2016", danke für die Mitteilung!

32voto

Philip Kelley Punkte 38051

SQL Server (2005, 2000, 7.0) verfügt über keine flexible oder gar nicht flexible Möglichkeit, eine beliebig strukturierte Datetime im String-Format in den Datentyp datetime zu konvertieren.

Mit "willkürlich" meine ich "eine Form, die die Person, die sie geschrieben hat, wenn auch vielleicht nicht Sie oder ich oder jemand auf der anderen Seite des Planeten, als intuitiv und völlig offensichtlich ansehen würde". Ehrlich gesagt, bin ich mir nicht sicher, ob es einen solchen Algorithmus gibt.

38 Stimmen

Es gibt einen solchen Algorithmus, Oracle hat ihn bereits implementiert, und das Fehlen einer Entsprechung in SQL Server ist ein ständiges Ärgernis.

20 Stimmen

@matao, bitte klären Sie uns auf, wie Oracle auf magische Weise feststellt, ob ein Benutzer, der ein 9/6/12 den 6. September 2012, den 9. Juni 2012, den 6. Dezember 2009, oder etwas anderes?

16 Stimmen

Keine Sorge, hier: techonthenet.com/oracle/funktionen/zu_datum.php Natürlich muss es ein konsistentes Format sein, das Sie als Entwickler festlegen, aber es ist wesentlich flexibler als die wenigen Formatmasken, die MS Ihnen zur Verfügung stellt, was zu einem mühsamen benutzerdefinierten Parsing führt.

13voto

Simone Punkte 1187

Verwenden Sie dies:

SELECT convert(datetime, '2018-10-25 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

Und siehe die Tabelle in der offizielle Dokumentation für die Konvertierungscodes.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X