2009-09-10 184 views
2

我wan't到我的记录条目从dateTtime转换+偏移dateTtimeZ直接SQL转换为GMT日期时间

(2008-05-11T15:30:00 + 2 ---> 2008-05-11T13: 30:00Z)

带有sql函数。

不知道如何做到这一点:-(

我需要实现这个使用MySQL不使用存储的特效

THX

回答

1

如果我理解正确你的问题prefering,没有从时间+偏移量中找出时区,因为映射不是唯一的,几个时区可能具有相同的偏移量

看看这个例子,其中多个时区具有相同的偏移量

(GMT-06:00) Saskatchewan 
(GMT-06:00) Guadalajara, Mexico City, Monterrey - Old 
(GMT-06:00) Guadalajara, Mexico City, Monterrey - New 
(GMT-06:00) Central Time (US & Canada) 
(GMT-06:00) Central America 

增加:现在我看到你问别的东西。

好的,如果日期时间中的偏移量始终相同,则可以尝试此转换。

DECLARE @DateTimeWithOffset datetimeoffset 
DECLARE @JustDateTime datetime 

SET @DateTimeWithOffset = '2008-05-11 15:30:00 + 02:00' 

SELECT @DateTimeWithOffset = SWITCHOFFSET (@DateTimeWithOffset, '00:00') 

SELECT @JustDateTime = CAST (@DateTimeWithOffset AS datetime) 

这是给你的想法。我手边没有SQL 2008权限,所以我没有测试过。可能不起作用。

+0

我想OP表示格林尼治标准时间的“TZ” - 标题的文章。 – PaulMcG 2009-09-10 09:11:25

+0

我已经在 – Lici 2009-09-10 09:29:34

+0

以上添加了一个转换示例请注意,'SWITCHOFFSET'是SQL Server 2008 – devstuff 2009-09-10 10:26:34

1

我用我的SQL内置函数很生疏,但是在没有任何标准函数的情况下,可以编写一个存储过程来完成这项工作。然后,你可以调用它作为你的SELECT语句的一部分:

SELECT to_GMT(invoice_date) from INVOICES 
+0

的新增功能,可能更适合构建标量函数,它可以是一次性的,并且可以更有效地对结果集进行操作。特别是如果需要在查询中更改日期。 – GoldBishop 2017-11-08 16:42:45

1

它不是从你的问题不清楚,但我相信你有值的字符串。如果是这样,然后提取之外的所有偏移为datetime,也得到了偏移为datetime,然后用符号来计算最终结果(T-SQL,2005年):

DECLARE @withOffset varchar(30); 
SET @withOffset = '2008-05-11T15:30:00+2:00'; 
PRINT N'Original: ' + CAST(@withOffset AS nvarchar); 

DECLARE @dt datetime; 
SET @dt = CONVERT(datetime, LEFT(@withOffset, 19), 126); 
PRINT N'dt=' + CONVERT(nvarchar, @dt, 127); 

DECLARE @ofs datetime; 
SET @ofs = CONVERT(datetime, SUBSTRING(@withOffset, 21, LEN(@withOffset) - 21), 108); 
PRINT N'ofs=' + CAST(@ofs AS nvarchar); 

IF (SUBSTRING(@withOffset, 19, 1) = '+') 
BEGIN 
    SET @dt = DATEADD(hour, DATEPART(hour, @ofs), @dt); 
    SET @dt = DATEADD(minute, DATEPART(minute, @ofs), @dt); 
END 
ELSE 
BEGIN 
    SET @dt = DATEADD(hour, -DATEPART(hour, @ofs), @dt); 
    SET @dt = DATEADD(minute, -DATEPART(minute, @ofs), @dt); 
END; 

PRINT N'dt=' + CONVERT(nvarchar, @dt, 127); 
1

该解决方案将可能取决于你的RDBMS。在Oracle这样的工作:

SQL> SELECT to_timestamp_tz('2008-05-11T15:30:00+2', 
    2       'yyyy-mm-dd"T"hh24:mi:ssTZH') 
    3   AT TIME ZONE 'GMT' gmt_time 
    4 FROM dual; 

GMT_TIME 
---------------------------------- 
11/05/08 13:30:00,000000000 GMT 
7

试试这个

从格林尼治标准时间转换为本地时间:

select DATEADD(hour,DATEDIFF (hour, GETUTCDATE(), GETDATE()),MyGmtDateTime) as LocalDateTime 

从本地时间转换为GMT:

select DATEADD(hour,DATEDIFF (hour, GETDATE(), GETUTCDATE()),MyLocalDateTime) as GmtDateTime