Wie analysiere ich einen String in ein Datum?

85

Wie kann ich in T-SQL einen String in ein Datum konvertieren?

Mein Testfall ist die Zeichenfolge: '24.04.2012'

Nazar Tereshkovych
quelle

Antworten:

21

Angenommen, die Datenbank ist MS SQL Server 2012 oder höher, dann ist hier eine Lösung, die funktioniert. Die grundlegende Anweisung enthält die Inline-Try-Parse:

SELECT TRY_PARSE('02/04/2016 10:52:00' AS datetime USING 'en-US') AS Result;

Folgendes haben wir in der Produktionsversion implementiert:

UPDATE dbo.StagingInputReview
 SET ReviewedOn = 
     ISNULL(TRY_PARSE(RTrim(LTrim(ReviewedOnText)) AS datetime USING 'en-US'), getdate()),
 ModifiedOn = (getdate()), ModifiedBy = (suser_sname())
 -- Check for empty/null/'NULL' text
 WHERE not ReviewedOnText is null 
   AND RTrim(LTrim(ReviewedOnText))<>''
   AND Replace(RTrim(LTrim(ReviewedOnText)),'''','') <> 'NULL';

Die Spalten ModifiedOn und ModifiedBy dienen nur der internen Datenbankverfolgung.

Siehe auch diese Microsoft MSDN-Referenzen:

MAbraham1
quelle
Dies setzt voraus, dass das OP SQL Server 2012+ verwendet
Mark Kram
8

Obwohl das CONVERT-Ding funktioniert, sollten Sie es eigentlich nicht verwenden. Sie sollten sich fragen, warum Sie Zeichenfolgenwerte in SQL-Server analysieren. Wenn dies ein einmaliger Job ist, bei dem Sie einige Daten manuell reparieren, erhalten Sie diese Daten ein anderes Mal nicht. Dies ist in Ordnung. Wenn jedoch eine Anwendung dies verwendet, sollten Sie etwas ändern. Am besten verwenden Sie den Datentyp "Datum". Wenn dies Benutzereingaben sind, ist dies noch schlimmer. Dann sollten Sie zuerst den Client einchecken. Wenn Sie wirklich Zeichenfolgenwerte übergeben möchten, bei denen SQL-Server ein Datum erwartet, können Sie immer das ISO-Format ('JJJJMMTT') verwenden, das automatisch konvertiert werden soll.

Eric
quelle
5
Was ist mit einer Situation, in der Sie Datendateien von einem externen System importieren und die Eingabespalte zufällig in einem dieser Formate vorliegt, z. B. "31.05.2013", das jedoch als Zeichenfolge eingeht? Und Sie schreiben beispielsweise eine gespeicherte Prozedur zum Importieren dieser Daten oder verwenden SSIS zum Importieren? Dann wäre CONVERT das Richtige, nicht wahr?
David Barrows
In Situationen, in denen MS SQL Server-Analysedatenmodelle im Gegensatz zu Transaktionsmodellen hostet, ist es nicht unbedingt in Ordnung, CONVERT zu verwenden, da es sich um viele externe Quellen handelt, die nicht ohne weiteres als Datumstyp eingehen würden (wie David Barrows oben angedeutet hat).
Wird
Standard Stringliteral Format für Daten ist YYYY-MM-DD
YB
4

Sie können verwenden:

SELECT CONVERT(datetime, '24.04.2012', 103) AS Date

Referenz: CAST und CONVERT (Transact-SQL)

Seann Alexander
quelle
Es ist interessant, dass funktioniert. Das Format 103 ist TT / MM / JJJJ und 104 ist TTMMJJJJ.
Jeff Moden
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

wird tun, was benötigt wird, Ergebnis:

2012-04-24 00:00:00.000
JMMS Karunarathne
quelle
Das scheint nicht für das zu funktionieren, was das OP gepostet hat, selbst für verschiedene Spracheinstellungen. Versuch es. Wenn es für Sie tatsächlich funktioniert, geben Sie bitte Ihre aktuelle Spracheinstellung an. Vielen Dank. Hier ist der Code zum Ausprobieren ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden