亲爱的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。
答案 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