【问题标题】:Oracle Timestamp UTC time formatOracle Timestamp UTC 时间格式
【发布时间】:2010-09-02 17:29:23
【问题描述】:
CREATE TABLE DIALOGUE_TABLE(EXPIRE_TIME TIMESTAMP);

以下代码 sn-p 在存储过程中:

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 格式。

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

也许我错过了一些我不知道的东西? 客户端有什么我需要做的吗?

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    如果该列被声明为 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';
    

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

    【讨论】:

      猜你喜欢
      • 2017-05-27
      • 2011-10-11
      • 2020-03-09
      • 2023-04-04
      • 2018-11-07
      • 2019-07-27
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多