to_char 根据调用过程的位置产生不同的输出

发布于 2024-12-21 01:37:30 字数 827 浏览 3 评论 0原文

我们正在使用远程系统提供的存储过程。出于测试目的,我从我的开发机器上调用此过程。现在的问题是,如果我从 Toad 调用该过程,一切都会正常。但是当我使用 SQL Developer 调用它时,会发生错误。

我调试了又调试,发现了这一点:在该过程中,生成了一个到期日期并将其传递给网络服务(不要问我为什么)。

以下是负责生成日期的行:

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 代码的瘦驱动程序 连接到远程数据库。

We're using a stored procedure provided by a remote system. For testing purposes, I call this procedure from my development machine. Now the problem is if I call the procedure from Toad, everything is OK. But when I call it using SQL Developer an error happens.

I debugged and debugged and found out this: In the procedure, an expire date is generated and passed to a web service (don't ask me why).

Here are the lines responsible for generating the date:

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, when called from Toad is generated like:

2025-01-01T00:00:00+02:00

But if I call from SQL Developer, it's like:

2025-01-01T00:00:00EUROPE/ATHENS

Everything except these lines are exactly the same. I tried many different approach, trying to set NLS_LANG, altering the session etc but to no result.

I need to solve this because the same thing happens when I call the procedure from Java code also and that's the main issue.

I connect to the remote database using TNS for Toad and SQL Developer, thin driver for the Java code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光清浅 2024-12-28 01:37:30

在 Oracle DB 中,您基本上有一个数据库的 TIME_ZONE 定义,但您可以为会话更改它。
在这种情况下,DB time_zone 设置为与 UTC 格式的绝对偏移量,这正是您想要的。
SQL Developer 可能以时区区域名称格式打开会话,如下所示:

select sessiontimezone, dbtimezone from dual;

因此,将会话更改为 dbtimezone 可能会有所帮助。

ALTER SESSION SET TIME_ZONE=dbtimezone;

In Oracle DB you basically have a TIME_ZONE definition for the DB, but you can change it for a session.
In this case the DB time_zone is set in the Absolute offset from UTC format which is what you want.
Probably the SQL Developer opened the session in Time zone region name format, as could be seen with:

select sessiontimezone, dbtimezone from dual;

So, altering the session to be as dbtimezone may help.

ALTER SESSION SET TIME_ZONE=dbtimezone;
一口甜 2024-12-28 01:37:30

使用 tzh 和 tzm 有另一个解决方案:

select to_char(current_timestamp, 'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') from dual

have another solution using tzh and tzm:

select to_char(current_timestamp, 'yyyy-mm-dd"T"hh24:mi:sstzh:tzm') from dual
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文