2010-09-02 55 views
2
CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP); 

下列代碼段是內部存儲過程:甲骨文時間戳UTC時間格式

PO_EXPIRETIME :- OUT PARAM of procedure a varchar2 

SELECT TO_CHAR(SYS_EXTRACT_UTC(EXPIRE_TIME)) 
    INTO PO_EXPIRETIME 
    FROM DIALOGUE_TABLE; 

當我運行使用EXEC和打印PO_EXPIRETIME時間戳是正確與UTC格式服務器存儲過程。

但是,當我從和客戶端調用存儲過程接收的時間戳不是相同的,但是這是表格中的實際時間戳不是UTC格式化。

也許我失蹤的東西,但我不知道? 客戶端有什麼需要做的嗎?

回答

5

如果列被聲明爲TIMESTAMP而不是TIMESTAMP WITH TIME ZONE或TIMESTAMP WITH LOCAL TIME ZONE,則存儲在表中的時間戳將不會有時區組件。因此,SYS_EXTRACT_UTC會使用由客戶端控制的會話時區將時間戳轉換爲UTC,並且在不同的客戶端計算機上可能會有所不同。我懷疑,如果你從你的OCCI應用程序並從您的SQL * Plus會話中運行

SELECT SessionTimeZone 
    FROM dual; 

,你將結束,這是造成字符串返回到不同不同的結果。

如果您希望返回的字符串獨立於客戶端計算機,我傾向於建議將時區存儲在數據庫列中。是否將模式定義更改爲使用TIMESTAMP WITH TIME ZONE選項?除非,你能保證每一個客戶機都配置了相同的時區和/或存儲過程運行一個明確的ALTER SESSION,即

ALTER SESSION 
    SET time_zone = '-05:00'; 

,以保證轉換總是從一個特定的時間段進行。

+0

- thannks Justin.that解決了我的問題。 – 2010-09-02 20:21:27