将ISO格式的日期转换为DATETIME

时间:2013-03-29 10:26:17

标签: sql-server-2008 type-conversion

我正在使用SQL Server Management Studio编写SQL查询,并且ISO日期格式中有一些NVARCHAR类型值(例如:20130302T164800)。我需要将它们转换为DATETIME

我尝试了Convert()函数,但它会导致异常:

  

将nvarchar数据类型转换为日期时间数据类型会导致超出范围的值

我有办法做到这一点吗?

1 个答案:

答案 0 :(得分:6)

问题是您的字符串不是接受的SQL Server日期时间格式。 SQL Server识别 ISO8601 格式,即:

yyyy-mm-ddThh:mi:ss.mmm

上述日期为 2013-03-02T16:48:00

请参阅Date And Time Styles部分。

因此以下陈述将失败:

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 with demo

您可以将格式更新为一个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 with demo

这只是一个示例,您可以将其转换为SQL Server可识别的任何格式,但这会将其转换为 ISO8601 。基本上,将其转换为不同的格式以允许转换工作。