【发布时间】:2012-05-05 06:01:48
【问题描述】:
我有一个 DateTime varchar,格式如下:2005-08-08T00:00:00+01:00。
- 这种格式有名字吗? (不是 ISO8601。是 RFC3339 吗?)
- 如何使用 Transact-Sql 将其转换为 DateTime?
编辑 这是一个摘要答案,由其他人的输入拼凑而成:
- 它是 ISO8601 与UTC 的时间偏移。如果是 UTC,它将以“Z”而不是“+01:00”结尾。 wikipedia
-
您可以将其转换为当地时间或UTC,如下所示:
DECLARE @d VARCHAR(25) SET @d = '2007-08-08T00:01:00+01:00' SET @d = '2007-08-08T00:01:00-01:00' SET @d = '2007-08-08T00:01:00+05:30'
选择 @d 作为输入,CONVERT(DATETIME, LEFT(@d, 19), 126) 作为 LocalDate , DATEADD(MINUTE , -CAST((SUBSTRING(@d, 20, 1) + RIGHT(@d, 2)) AS INT) , DATEADD(小时 ,-CAST(SUBSTRING(@d, 20, 3) AS INT) , CONVERT(DATETIME, LEFT(@d, 19), 126))) as UtcDate WHERE @d LIKE '_--_T__::[+-]:'
结果:
Input LocalDate UtcDate
------------------------- ----------------------- -----------------------
2007-08-08T00:01:00+01:00 2007-08-08 00:01:00.000 2007-08-07 23:01:00.000
2007-08-08T00:01:00-01:00 2007-08-08 00:01:00.000 2007-08-08 01:01:00.000
2007-08-08T00:01:00+05:30 2007-08-08 00:01:00.000 2007-08-07 18:31:00.000
【问题讨论】:
-
是的,我使用 google 找到了该页面。但是在那里找不到我的格式。
-
值得注意的是,您的 SUBSTRING() 语句删除了时区的分钟部分,这意味着它在相对于 UTC 不是整小时的时区中是不正确的。例如印度是 UTC+5:30。
-
哦,如果格式类似于 2005-08-08T00:00:00-01:00,即偏移量是负数而不是正数,那么您的结果将不正确。
-
Rory - 当时区不是整小时时,我已经编辑了 sql 以正确计算 utc,但是当偏移量为负时,我看不到计算有任何问题 - 请参阅上面的结果跨度>
标签: tsql sql-server-2005 datetime-format