Problem polega na tym, że Twój ciąg nie akceptowany format daty i godziny programu SQL Server. SQL Server rozpoznaje ISO8601 format, czyli:
yyyy-mm-ddThh:mi:ss.mmm
Który byłby 2013-03-02T16:48:00 dla powyższej daty.
Zobacz Style dat i godzin sekcja.
Zatem następujące stwierdzenie nie powiedzie się:
declare @date nvarchar(max) = '20130302T164800'
select convertedDate = cast(@date as datetime)
Jeśli przekonwertujesz ciąg na ISO8601 format, oświadczenie będzie działać:
declare @date nvarchar(max) = '2013-03-02T16:48:00'
select convertedDate = cast(@date as datetime)
SQL Fiddle z wersją demonstracyjną .
Możesz zaktualizować format tak, aby SQL Server rozpoznawał i rzutował ciąg na datę i godzinę w jednej instrukcji:
declare @date nvarchar(max) = '20130302T164800'
select cast(left(@date, 4)
+ '-' + substring(@date,5,2)
+ '-' + substring(@date,7,5)
+ ':' + substring(@date,12,2)
+ ':' + substring(@date,14,2) as datetime)
To tylko przykład, możesz przekonwertować go na dowolny format rozpoznawany przez SQL Server, ale to konwertuje go na ISO8601 . Zasadniczo przekonwertuj go na inny format, aby umożliwić konwersję.