2013-10-24 105 views
1

我是一個PL/SQL新手誰需要轉換milleseconds自UNIX時代以來 日期/時間。我可以轉換爲GMT日期/時間,但不知道如何調整時區的 。我很接近但並不完全。甲骨文:時代milleseconds日期/時間與時區包括

我輸入r_msg.OriginationTime,其中有像1382552100277

值這

MpD NUMBER  := (1/24/60/60/1000);  -- Milleseconds per Day 

DFmt24 VARCHAR2(21) := 'MM/DD/YYYY HH24:MI:SS'; -- Date format 

TMPorig24  VARCHAR2(20); 

. . . 

TMPorig24 := TO_CHAR(DATE '1970-01-01' + MpD * r_msg.OriginationTime, DFmt24); 

給出類似

10/23/2013 18:15:00 

這正是我想要的,除了它是GMT。

TimeZoneOffset VARCHAR(7); 

    . . . 

    TimeZoneOffset := tz_offset('America/New_York'); 

-04:00 

所以我只需要像做

TMPorig24 := TMPorig24 + TimeZoneOffset; 

,但我得到

ORA-06502: PL/SQL: numeric or value error: character to number conversion error 

我已經嘗試了幾個變化,但沒有任何作品。

任何幫助表示讚賞。


謝謝,但我有兩個解決方案的問題。

無論時區如何,第一個解決方案都可以同時打印。例如,這些打印相同的值。 (CAST(DATE'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'America/New_York'),'America/New_York','''''', MM/DD/YYYY HH24:MI:SS'); (CAST(DATE'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP),'Pacific/Pago_Pago'),'''''''''''''''''''''''''' MM/DD/YYYY HH24:MI:SS');

第二溶液

TMPorig:= TO_CHAR( DATE '1970-01-01' +(1/24/60/60/1000)* r_msg.OriginationTime + INTERVAL '-04:00' HOUR TO MINUTE,'MM/DD/YYYY HH24:MI:SS');

PLS-00166: bad format for date, time, timestamp or interval literal 

Moveover,'04:00' 當夏令時結束將是錯誤的。 我需要表達一下EST/EDT和GMT之間的時差。

** * ** * ** *運行完美THANKS * ** * ** * ** * ** * *

TMPorig2:= TO_CHAR((CAST(日期'1970-01-01'+(1/24/60/60/1000)* r_msg.OriginationTime AS TIMESTAMP)'UTC') AT TIME ZONE'America/New_York','MM/DD/YYYY HH24:MI:SS');


+0

好吧,我已經編輯我的答案 - 檢查新的解決方案。 –

回答

1

編輯:好吧,試試這個方法,而不是:

SELECT 
    TO_CHAR (
    FROM_TZ (
     CAST (DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP), 
     'UTC') 
    AT TIME ZONE 'America/New_York', 
    'MM/DD/YYYY HH24:MI:SS') val 
FROM dual; 

輸出:

VAL    
------------------- 
10/23/2013 14:15:00

你必須在DATE轉換爲TIMESTAMP並使用FROM_TZ功能轉換TIMESTAMP轉換爲TIMESTAMP WITH TIME ZONE數據類型。時區參數的格式可以是:America/New_York-04:00

SELECT 
    TO_CHAR(
    FROM_TZ(
     CAST(DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 AS TIMESTAMP), 
     'America/New_York'), 
    'MM/DD/YYYY HH24:MI:SS') 
FROM dual; 

這就是如果你想有一個TIMESTAMP WITH TIME ZONE變量。如果你想添加自定的時區偏移,那麼你可以使用:

SELECT 
    TO_CHAR(
     DATE '1970-01-01' + (1/24/60/60/1000) * 1382552100277 + INTERVAL '-04:00' HOUR TO MINUTE, 
    'MM/DD/YYYY HH24:MI:SS') AS val 
FROM dual; 

輸出:

VAL    
------------------- 
10/23/2013 14:15:00
+0

這對我來說很好 - 你碰巧有一些代碼從一個字符串到另一個時代之後的幾秒鐘? – dldnh

+0

@dldnh你能提供一個樣本數據和你期望的輸出嗎? –