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())
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:
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.
źródło
Możesz użyć:
SELECT CONVERT(datetime, '24.04.2012', 103) AS Date
Dokumentacja: CAST and CONVERT (Transact-SQL)
źródło
zrobi, co trzeba, wynik:
źródło