2014-10-29 110 views
0

我希望将UTC的日期/时间转换为当地CST。Oracle SQL:将UTC转换为CST

下面的功能工作,但它应该只有5小时(直到11/2/2014的日光节约)时,6小时的差异。

CAST((FROM_TZ(CAST(utc_date AS TIMESTAMP),'UTC') AT TIME ZONE 'CST') AS DATE) cst_date 

还尝试了变化

to_date(to_char((from_tz(to_timestamp(to_char(utc_date, 'YYYY-MM-DD HH24:MI:SS'), 'YYYY-MM-DD HH24:MI:SS') ,'UTC') 
at time zone 'CST'),'YYYY-MM-DD HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS') as cst_date, 
+0

'utc_date'列的数据类型是什么? – 2014-10-30 09:15:51

+0

@Wernfried数据类型是DATE。需要时间戳来使用FROM_TZ。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions059.htm。在Rajesh Chamarthi看到我的最后一条评论。 – user3050672 2014-10-30 12:31:29

回答

0

使用时区区域而不是时区简称( 'CST')。您可以在此找到需要的时区:

SELECT * from v$timezone_names where tzabbrev = 'CST'; 

也许你需要的不是“CST”

+0

好点。当我看到tzabbrev ='CST'下的不同地区时,我希望该地区能够解决这个问题。但是,与“美国/芝加哥”区域相同的结果相同 – user3050672 2014-10-29 18:21:16

1

“CST6CDT”使用“美/中环”为目标时区似乎产生正确的结果。

select from_tz(CAST ('15-oct-2014' AS TIMESTAMP),'GMT') at TIME ZONE 'US/Central' with_daylight_savings, 
     from_tz(CAST ('15-nov-2014' AS TIMESTAMP),'GMT') at TIME ZONE 'US/Central' without_daylight_savings 
from dual; 


WITH_DAYLIGHT_SAVINGS      WITHOUT_DAYLIGHT_SAVINGS 
-------------------------------------------------------------------------------------- 
14-OCT-14 07.00.00.000000000 PM US/CENTRAL 14-NOV-14 06.00.00.000000000 PM US/CENTRAL 
+0

这会给您5小时的预期差异。 – user3050672 2014-10-29 19:09:26

+0

SELECT TO_DATE('2013-10-29 18:00:00','YYYY-MM-DD HH24:MI:SS'), NEW_TIME(TO_DATE('2013-10-29 18:00:00',' YYYY-MM-DD HH24:MI:SS'), 'GMT', 'CDT') FROM DUAL; – user3050672 2014-10-29 19:10:58

+0

在这里,我期待在节约时间后调整6小时。 – user3050672 2014-10-29 19:11:32

0

也许是一个愚蠢的做法,但你从这个查询中得到什么?

SELECT 
    TO_CHAR((TIMESTAMP '2014-01-01 00:00:00' + LEVEL * INTERVAL '1' DAY) AT TIME ZONE 'America/Chicago', 'yyyy-mm-dd hh24:mi TZH:TZM') AS dst, 
    TO_CHAR((FROM_TZ(CAST(DATE '2014-01-01' AS TIMESTAMP), 'UTC') + LEVEL * INTERVAL '1' DAY) AT TIME ZONE 'America/Chicago', 'yyyy-mm-dd hh24:mi TZH:TZM') AS dst 
FROM dual 
CONNECT BY LEVEL <= 365; 

是否如预期的那样?