Wie analysiere ich einen String in ein Datum?


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:


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.


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


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

wird tun, was benötigt wird, Ergebnis:

2012-04-24 00:00:00.000

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.