问题是你的字符串是not可接受的 SQL Server 日期时间格式。 SQL Server 识别ISO8601格式,即:
yyyy-mm-ddThh:mi:ss.mmm
哪一个会是2013-03-02T16:48:00对于您上面的日期。
See 日期和时间样式部分。
所以下面的语句将会失败:
declare @date nvarchar(max) = '20130302T164800'
select convertedDate = cast(@date as datetime)
如果将字符串转换为ISO8601格式,该语句将起作用:
declare @date nvarchar(max) = '2013-03-02T16:48:00'
select convertedDate = cast(@date as datetime)
SQL Fiddle 演示.
您可以将格式更新为 SQL Server 可以识别的一种格式,并在一条语句中将字符串转换为日期时间:
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 演示.
这只是一个示例,您可以将其转换为 SQL Server 识别的任何格式,但这会将其转换为ISO8601。基本上,将其转换为不同的格式以允许转换工作。