有没有办法从 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 对象同时具有 offset
和 zoneID
设置为 +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/