从DateTime减去偏移量(日期时间到UTC)

时间:2016-05-04 07:46:42

标签: sql sql-server timezone-offset datetimeoffset

亲爱的DB大师我再次需要帮助。

我有下表,我需要使用Offset列中的信息将不同的本地时间转换为GMT

Order Time          Offset
2016-05-03 10:08:22 +0200
2016-05-03 10:08:22 +0300
2016-05-03 13:11:26 +0200
2016-05-03 11:07:27 +0200
2016-05-03 14:22:35 +0200
2016-05-03 16:31:36 +0300

我瞄准的结果是这样的

Order Time          
2016-05-03 08:08:22
2016-05-03 07:08:22 
2016-05-03 11:11:26 
2016-05-03 09:07:27 
2016-05-03 12:22:35 
2016-05-03 13:31:36

实际上我需要按UTC计算时间。

例如2016-05-03 11:25:26 +0300偏移需要成为2016-05-03 08:25:26 UTC。

3 个答案:

答案 0 :(得分:0)

试试这个:

SELECT TODATETIMEOFFSET([Order Time], '-' +
            substring(t.Offset, 2, len(t.Offset) - 2) + ':' +
            substring(t.Offset, len(t.Offset) - 2, 2))
FROM yourtable t

答案 1 :(得分:0)

我已使用LEFT来获取符号和小时数,LEFT + RIGHT获取符号和分钟数,然后使用{{1将CAST值更改为varchar值,从那里它只需要一个简单的int分钟和DATEADD几小时:

声明样本表

DATEADD

填充样本表

DECLARE @YourTable As Table
(
    [Order Time] datetime,
    Offset varchar(6)
)

选择

INSERT INTO @YourTable VALUES 
('2016-05-03 10:08:22', '+0200'),
('2016-05-03 10:08:22', '+0300'),
('2016-05-03 13:11:26', '-0200'), -- Note: - 2 hours
('2016-05-03 11:07:27', '+0200'),
('2016-05-03 14:22:35', '+0200'),
('2016-05-03 16:31:36', '-0325') -- Note: - 3 hours 25 minutes

<强>结果

SELECT  Offset, [Order Time],
        DATEADD(HOUR, 
                -CAST(LEFT(Offset, LEN(Offset)-2) as int), 
                DATEADD(MINUTE, 
                        -CAST(LEFT(Offset, 1) + RIGHT(Offset, 2) as int), 
                        [Order Time])
                ) As [Order Time UTC]
FROM @YourTable

答案 2 :(得分:0)

另一种方式:

;WITH cte AS (
SELECT *
FROM (VALUES
('2016-05-03 10:08:22', '+0200'),
('2016-05-03 10:08:22', '+0300'),
('2016-05-03 13:11:26', '+0200'),
('2016-05-03 11:07:27', '+0200'),
('2016-05-03 14:22:35', '+0200'),
('2016-05-03 16:31:36', '+0300')
) AS t([Order Time], Offset)
)

SELECT CAST(SWITCHOFFSET(TODATETIMEOFFSET([Order Time], STUFF(Offset,4,0,':')),'-00:00')as datetime)
FROM cte

输出:

2016-05-03 08:08:22.000
2016-05-03 07:08:22.000
2016-05-03 11:11:26.000
2016-05-03 09:07:27.000
2016-05-03 12:22:35.000
2016-05-03 13:31:36.000