Vấn đề là chuỗi của bạn không định dạng ngày giờ của SQL Server được chấp nhận. SQL Server nhận ra ISO8601 định dạng, đó là:
yyyy-mm-ddThh:mi:ss.mmm
Đó sẽ là 2013-03-02T16:48:00 cho ngày của bạn ở trên.
Xem Kiểu Ngày và Giờ phần.
Vì vậy, câu lệnh sau sẽ không thành công:
declare @date nvarchar(max) = '20130302T164800'
select convertedDate = cast(@date as datetime)
Nếu bạn chuyển đổi chuỗi thành ISO8601 định dạng, câu lệnh sẽ hoạt động:
declare @date nvarchar(max) = '2013-03-02T16:48:00'
select convertedDate = cast(@date as datetime)
Bạn có thể cập nhật định dạng của mình lên một SQL Server nhận dạng và truyền chuỗi thành ngày giờ trong một câu lệnh:
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)
SQL Fiddle với bản trình diễn .
Đây chỉ là một ví dụ, bạn có thể chuyển đổi nó sang bất kỳ định dạng nào được SQL Server công nhận, nhưng điều này sẽ chuyển nó thành ISO8601 . Về cơ bản, hãy chuyển đổi nó sang một định dạng khác để cho phép chuyển đổi hoạt động.