Oracle时间戳UTC时间格式

时间:2010-09-02 17:29:24

标签: sql oracle plsql oracle11g

CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP);

以下代码段位于存储过程中:

PO_EXPIRETIME  :- OUT PARAM of procedure a varchar2

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

当我使用EXEC从服务器运行Stored Proc时,打印PO_EXPIRETIME时间戳适用于UTC格式。

但是当我从OCCI和客户端调用存储过程时,收到的时间戳不相同,但是表格中的实际时间戳不是UTC格式化的。

也许是我遗失的东西,但我不知道的是什么? 我需要在客户端做些什么吗?

1 个答案:

答案 0 :(得分:5)

如果列被声明为TIMESTAMP而不是,例如TIMESTAMP WITH TIME ZONE或TIMESTAMP WITH LOCAL TIME ZONE,则表中存储的时间戳将没有时区组件。因此,SYS_EXTRACT_UTC将使用会话时区将时间戳转换为UTC,该会话时区由客户端控制,并且在不同的客户端计算机上可能不同。我怀疑如果你跑

SELECT SessionTimeZone
  FROM dual;

从您的OCCI应用程序和SQL * Plus会话中,您将得到不同的结果,这会导致返回的字符串不同。

如果您希望返回的字符串独立于客户端计算机,我倾向于建议将时区存储在数据库列中。是否正在更改模式定义以使用TIMESTAMP WITH TIME ZONE选项?除此之外,您可以确保每台客户机都配置了相同的时区和/或运行明确的ALTER SESSION,即

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

在存储过程中,以确保始终从特定时区完成转换。