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
格式化的。
也许是我遗失的东西,但我不知道的是什么? 我需要在客户端做些什么吗?
答案 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';
在存储过程中,以确保始终从特定时区完成转换。