无法在SQL中将VARCHAR转换为DATETIME(使用时区)

时间:2014-11-21 18:55:05

标签: sql-server-2012

我尝试使用SQL CONVERT命令将SQL Server 2012中的VARCHAR转换为DATETIME。我按照说明操作,但我想要使用此MSDN页面上描述的日期/时间格式:http://msdn.microsoft.com/en-us/library/ms187928.aspx

基于此,格式#127描述如下:

  
      
  • 带时区Z的ISO8601。
  •   
  • yyyy-mm-ddThh:mi:ss.mmmZ(没有空格)
  •   
  • 当毫秒(mmm)的值为0时,不显示毫秒值。例如,值' 2012-11-07T18:26:20.000显示为' 2012-11-07T18:26:20'。
  •   
  • 可选的时区指示符Z用于更轻松地将具有时区信息的XML日期时间值映射到没有时区的SQL Server日期时间值。 Z是时区UTC-0的指示符。其他时区用+或 - 方向的HH:MM偏移表示。例如:2006-12-12T23:45:12-08:00。
  •   

但是,当我尝试实际进行转换(遵循此格式)时,它会失败......

SELECT CONVERT(datetime, '2014-07-14T10:00:00.000-08:00', 127)

...出现以下错误:

  

Msg 241,Level 16,State 1,Line 1
  从字符串转换日期和/或时间时转换失败。

任何人都知道为什么这不起作用?

编辑:这个例子不起作用:

SELECT CONVERT(datetime, '2006-12-12T23:45:12-08:00', 127)
  

Msg 241,Level 16,State 1,Line 1
  从字符串转换日期和/或时间时转换失败。

1 个答案:

答案 0 :(得分:3)

由于它是一个包含 timezone 的字符串,因此您需要将其转换为DATETIMEOFFSET类型:

SELECT CONVERT(DATETIMEOFFSET, '2014-07-14T10:00:00.000-08:00', 127)

(No column name)
----------------------------------
2014-07-14 10:00:00.0000000 -08:00

这很好用。完成后,您可以根据需要将其转换为本地DATETIME,例如与

DECLARE @DateTimeOffset DATETIMEOFFSET 
CAST(@DateTimeOffset AS DATETIME)

或通过

将值切换到另一个时区
SELECT SWITCHOFFSET(@DateTimeOffset, '+01:00')