Jak przetworzyć ciąg na datę?

85

Jak przekonwertować ciąg znaków na datę w T-SQL?

Mój przypadek testowy to ciąg: '24.04.2012'

Nazar Tereshkovych
źródło

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:

MAbraham1
źródło
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.

Eric
źródło
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
4

Możesz użyć:

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

Dokumentacja: CAST and CONVERT (Transact-SQL)

Seann Alexander
źródło
To ciekawe, że działa. Format 103 to dd / mm / rrrr, a 104 to dd.mm.rrrr.
Jeff Moden
1
CONVERT(DateTime, ExpireDate, 121) AS ExpireDate

zrobi, co trzeba, wynik:

2012-04-24 00:00:00.000
JMMS Karunarathne
źródło
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