to_char 根据调用过程的位置产生不同的输出
Posted
技术标签:
【中文标题】to_char 根据调用过程的位置产生不同的输出【英文标题】:to_char produces different outputs depending on where the procedure is called 【发布时间】:2011-12-13 08:48:47 【问题描述】:我们正在使用远程系统提供的存储过程。出于测试目的,我从我的开发机器调用此过程。现在的问题是,如果我从 Toad 调用该过程,一切正常。但是当我使用 SQL Developer 调用它时,会发生错误。
我调试和调试,发现:在过程中,会生成过期日期并传递给 Web 服务(不要问我为什么)。
以下是负责生成日期的行:
vt_User.EXPDATE := TO_DATE('01.01.2025', 'dd.mm.yyyy');
vs_Value := to_char(vt_User.EXPDATE, 'YYYY-MM-DD"T"HH24:MI:SSTZR');
vs_Value,当从 Toad 调用时生成如下:
2025-01-01T00:00:00+02:00
但如果我从 SQL Developer 调用,它就像:
2025-01-01T00:00:00EUROPE/ATHENS
除了这些行之外的所有内容都完全相同。我尝试了许多不同的方法,尝试设置 NLS_LANG,更改会话等但没有结果。
我需要解决这个问题,因为当我从 Java 代码调用过程时也会发生同样的事情,这是主要问题。
对于 Toad 和 SQL Developer,我使用 TNS 连接到远程数据库,对于 Java 代码,我使用 thin driver。
【问题讨论】:
vt_User.EXPDATE 的类型是什么?你确定这是日期而不是时间戳? 它的类型为TIMESTAMP WITH TIME ZONE
当你这样做时会得到什么:select sessiontimezone, dbtimezone from dual;
尝试 ALTER SESSION SET TIME_ZONE=dbtimezone;或将数据类型更改为 TIMESTAMP WITH LOCAL TIME ZONE
太棒了! ALTER SESSION SET TIME_ZONE=dbtimezone;
有效。非常感谢。
【参考方案1】:
在 Oracle DB 中,您基本上对 DB 有一个 TIME_ZONE 定义,但您可以为会话更改它。 在这种情况下,DB time_zone 设置为您想要的 UTC 格式的绝对偏移量。 可能 SQL 开发人员以时区区域名称格式打开了会话,如下所示:
select sessiontimezone, dbtimezone from dual;
因此,将会话更改为 dbtimezone 可能会有所帮助。
ALTER SESSION SET TIME_ZONE=dbtimezone;
【讨论】:
【参考方案2】:有另一个使用 tzh 和 tzm 的解决方案:
select to_char(current_timestamp, 'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') from dual
【讨论】:
以上是关于to_char 根据调用过程的位置产生不同的输出的主要内容,如果未能解决你的问题,请参考以下文章