2016-03-02 110 views
0

您好我有包含时间戳的数据的日期字段(OPEN_TIME)。本专栏中的时间以UTC表示。我想选择该列并将其转换为EST并将其插入到另一个表中。我希望它在原始时间戳时为EST(考虑夏令时基于当月的哪一天)。我一直在阅读有关Oracle中的各个时区功能,但大多数人似乎把重点放在改变,我不需要做数据库的时区。 (Open_Time)字段始终以UTC记录。如何在select语句中将UTC时间戳值从UTC转换为EST?

BLUF:我需要选择是根据UTC时间记录TIME_STAMP场(OPEN_TIME),并转换成什么EST在(OPEN_TIME)的时间。谢谢。

回答

3

如果您使用的是TIMESTAMP WITH TIME ZONE数据类型:

甲骨文设置

CREATE TABLE Table_Name (
    open_time TIMESTAMP WITH TIME ZONE 
); 

INSERT INTO Table_Name VALUES (SYSTIMESTAMP AT TIME ZONE 'UTC'); 

查询

SELECT open_time AT TIME ZONE 'UTC' AS utc, 
     open_time AT TIME ZONE 'EST' AS est 
FROM Table_Name; 

输出

UTC         EST        
----------------------------------- ----------------------------------- 
02-MAR-16 22.41.38.344809000 UTC 02-MAR-16 17.41.38.344809000 EST  

,或者如果你只是使用TIMESTAMP数据类型:

甲骨文设置

CREATE TABLE Table_Name (
    open_time TIMESTAMP 
); 

INSERT INTO Table_Name VALUES (SYSTIMESTAMP); 

查询

SELECT CAST(open_time AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'UTC' AS utc, 
     CAST(open_time AS TIMESTAMP WITH TIME ZONE) AT TIME ZONE 'EST' AS est 
FROM Table_Name; 

输出

UTC         EST        
----------------------------------- ----------------------------------- 
02-MAR-16 22.41.38.344809000 UTC 02-MAR-16 17.41.38.344809000 EST  
+0

非常棒的答案,非常感谢您花时间简洁地说明问题。 – Travis

+0

注意时区'EST' **不**考虑夏令时,尽量'INSERT INTO TABLE_NAME VALUES(SYSTIMESTAMP +间隔 '6' 个月)AT TIME ZONE 'UTC');'作比较。使用区域名称,例如'选择OPEN_TIME AT TIME ZONE“美/东”从...'或'EST5EDT' –

+0

我使用的这个,从我这个检查是做我想要的。谢谢! 'select i.dtm_open_time ,FROM_TZ(cast(i.dtm_open_time as timestamp),'0:00')AT TIME ZONE'US/Eastern' from dcc.incident i' – Travis