Jak przetworzyć ciąg na datę?


Odpowiedzi:




21

Zakładając, że baza danych to MS SQL Server 2012 lub nowszy, oto rozwiązanie, które działa. Instrukcja podstawowa zawiera wbudowaną instrukcję try-parse:

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

Oto co zaimplementowaliśmy w wersji produkcyjnej:

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';

Kolumny ModifiedOn i ModifiedBy służą tylko do śledzenia wewnętrznej bazy danych.

Zobacz także te referencje Microsoft MSDN:


Zakłada się, że OP używa Sql Server 2012+
Mark Kram

8

Chociaż funkcja CONVERT działa, tak naprawdę nie powinieneś jej używać. Powinieneś zadać sobie pytanie, dlaczego analizujesz wartości ciągów w SQL-Server. Jeśli jest to jednorazowa praca, w której ręcznie naprawiasz niektóre dane, nie otrzymasz tych danych innym razem, jest to w porządku, ale jeśli jakakolwiek aplikacja tego używa, powinieneś coś zmienić. Najlepszym sposobem byłoby użycie typu danych „data”. Jeśli chodzi o dane wejściowe użytkownika, jest jeszcze gorzej. Następnie powinieneś najpierw sprawdzić klienta. Jeśli naprawdę chcesz przekazać wartości ciągów, w których SQL-Server oczekuje daty, zawsze możesz użyć formatu ISO („RRRRMMDD”) i powinien on zostać skonwertowany automatycznie.


5
A co z sytuacją, w której importujesz pliki danych z jakiegoś zewnętrznego systemu, a kolumna wejściowa jest w jednym z tych formatów, np. „31.05.2013”, ale pojawia się jako ciąg? I piszesz, powiedzmy, procedurę składowaną do importowania tych danych lub używasz SSIS do zaimportowania ich? Wtedy CONVERT byłoby właściwą rzeczą do użycia, prawda?
David Barrows

Niekoniecznie, w sytuacjach, gdy MS SQL Server hostuje analityczne modele danych, w przeciwieństwie do modeli transakcyjnych, użycie CONVERT jest całkowicie w porządku, ponieważ musi radzić sobie z wieloma zewnętrznymi źródłami, które nie byłyby łatwo dostępne jako typ daty (jak wspomniał David Barrows powyżej).
Będzie

Domyślny ciąg dosłowne format daty to YYYY-MM-DD
YB


1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

zrobi, co trzeba, wynik:

2012-04-24 00:00:00.000

Wydaje się, że to nie działa w przypadku tego, co opublikował OP, nawet dla różnych ustawień językowych. Spróbuj. Jeśli to rzeczywiście działa, napisz, jakie jest Twoje aktualne ustawienie języka. Dzięki. Oto kod do wypróbowania ... SELECT CONVERT (DateTime, '24 .04.2012 ', 121) AS ExpireDate
Jeff Moden
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.