gpt4 book ai didi

java - 如何从 Oracle 获取时区 ID 而不是时区偏移量

转载 作者:行者123 更新时间:2023-12-04 13:29:56 25 4
gpt4 key购买 nike

有没有办法从 oracle 获取时区 ID 而不是时区偏移量?当我执行 SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL; 时,返回的结果是 13-JAN-21 10.19.52.936031000 AM +05:30

当我使用 rs.getObject( "TIMEZONE ", ZonedDateTime.class ) 从 Java 检索它时,ZonedDateTime 对象同时具有 offsetzoneID 设置为 +05:30

但我希望看到的是,SELECT SYSTIMESTAMP AS TIMEZONE FROM DUAL; 应该返回 04-JAN-21 02.40.50.000000000 PM ASIA/COLOMBO 和 Java ZonedDateTime对于查询,应将 offset 设置为 +05:30 并将 zoneID 设置为 Asia/Colombo

有没有办法在数据库级别或 Java 级别进行设置?当前 DBTIMEZONE 设置为 +05:30

最佳答案

如果数据已经在 Oracle SQL 表中,并且您必须转换为带时区的时间戳(例如,在您在同一张表中创建的新列中),则不需要显式地转到 OS ,或使用 Java 或任何其他东西,而不是 Oracle 数据库本身。

如果您必须假设“日期”是指服务器时区(您提到的“数据库”通常表示服务器)或客户端时区(您提到“ session ” "这意味着客户端)。无论哪种方式:

update <your_table>
set <timestamp_with_time_zone_col> =
from_tz(cast<date_col> as timestamp, dbtimezone)
;

或者使用 sessiontimezone 作为第二个参数,如果这是你需要的话。

这假定数据库(和/或 session )时区在数据库中分别在客户端中正确设置。如果不是/他们不是,则需要先修复。如果首先正确设置参数,Oracle 完全有能力处理日间节约时间。 (如果不是,则不清楚为什么您会首先尝试让您的操作比数据库支持的“更正确”。)

示例:在下面的 WITH 子句中,我模拟了一个表,其中列 dt 的数据类型为 date。然后我将其转换为带时区的时间戳,在我的 session (客户端)时区。

with
my_table ( dt ) as (
select to_date('2018-06-20 14:30:00', 'yyyy-mm-dd hh24:mi:ss') from dual
)
select dt,
from_tz(cast(dt as timestamp), sessiontimezone) as ts_with_tz
from my_table
;

DT TS_WITH_TZ
------------------- -------------------------------------------------
2018-06-20 14:30:00 2018-06-20 14:30:00.000000000 AMERICA/LOS_ANGELES

作为引用,您可以查看此链接 StackOverflow Ref. Link

关于java - 如何从 Oracle 获取时区 ID 而不是时区偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65695912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com