在 SQL 中将 VARCHAR 转换为 DATETIME 时遇到问题(带时区)

Ben*_*n H 4 sql-server-2012

我正在尝试使用 SQLCONVERT命令将 aVARCHAR转换为DATETIMESQL Server 2012 中的a 。我正在按照说明操作,并且我想使用此 MSDN 页面上描述的日期/时间格式:http : //msdn.microsoft.com /en-us/library/ms187928.aspx

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

  • ISO8601 时区 Z。
  • 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)
Run Code Online (Sandbox Code Playgroud)

...出现以下错误:


从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。

有谁知道为什么这不起作用?

编辑:该示例也不起作用:

SELECT CONVERT(datetime, '2006-12-12T23:45:12-08:00', 127)
Run Code Online (Sandbox Code Playgroud)


从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。

mar*_*c_s 7

由于它是一个带有时区的字符串,因此您需要将其转换为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
Run Code Online (Sandbox Code Playgroud)

这工作得很好。一旦有了它,您就可以DATETIME根据需要将其转换为本地文件,例如

DECLARE @DateTimeOffset DATETIMEOFFSET 
CAST(@DateTimeOffset AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

或者通过将值切换到另一个时区

SELECT SWITCHOFFSET(@DateTimeOffset, '+01:00') 
Run Code Online (Sandbox Code Playgroud)