2010-09-02 54 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