2014-10-29 168 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; 

是否如預期的那樣?