Oracle时间戳UTC时间格式

Sud*_*rma 2 sql oracle plsql oracle11g

CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP);
Run Code Online (Sandbox Code Playgroud)

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

PO_EXPIRETIME  :- OUT PARAM of procedure a varchar2

SELECT TO_CHAR(SYS_EXTRACT_UTC(EXPIRE_TIME)) 
  INTO PO_EXPIRETIME 
  FROM DIALOGUE_TABLE; 
Run Code Online (Sandbox Code Playgroud)

当我从服务器运行Stored Proc时EXEC,打印PO_EXPIRETIME时间戳与UTC格式正确.

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

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

Jus*_*ave 5

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

SELECT SessionTimeZone
  FROM dual;
Run Code Online (Sandbox Code Playgroud)

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

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

ALTER SESSION 
  SET time_zone = '-05:00';
Run Code Online (Sandbox Code Playgroud)

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