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 根据调用过程的位置产生不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

c#中两种不同的存储过程调用与比较

VRP系统——路由器配置之信息中心基础

如何在sqlserver存储过程中输出参数,语句是啥,我不用输出参数,我只是在体内输出语句,请问是啥??

Postgresql to_char 将字符添加到日期

oracle的存储过程里怎样调用动态变量

13:IO流