2016-05-04 65 views
0

亲爱的DB大师再次我需要帮助。从DateTime(日期到UTC)减去偏移量

我有以下的表,我需要使用信息的偏移量列到不同的本地时间变成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。

+0

为什么你被存储为+0200并没有为+02偏移:00? –

+0

它来自一个文件加载到DB – JONSY

+0

什么是列的数据类型? (我猜datetime和varchar) –

回答

0

试试这个:

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

对不起可能是我不清楚我的解释我实际上需要按UTC计算时间。例如2016 -05-03 11:25:26 +0300偏移需要变成2016-05-03 08:25:26 UTC – JONSY

+0

@JONSY:我已经更新了我的答案 –

0

我用LEFT得到的符号和小时数和LEFT + RIGHT得到的符号和分钟数,然后用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 

结果

Offset Order Time     Order Time UTC 
------ -----------------------  ----------------------- 
+0200 2016-05-03 10:08:22.000  2016-05-03 08:08:22.000 
+0300 2016-05-03 10:08:22.000  2016-05-03 07:08:22.000 
-0200 2016-05-03 13:11:26.000  2016-05-03 15:11:26.000 -- Note: - 2 hours 
+0200 2016-05-03 11:07:27.000  2016-05-03 09:07:27.000 
+0200 2016-05-03 14:22:35.000  2016-05-03 12:22:35.000 
-0325 2016-05-03 16:31:36.000  2016-05-03 19:56:36.000 -- Note: - 3 hours and 25 minutes 
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