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

标签 java oracle timezone

有没有办法从 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/

相关文章:

java - 日历对象时区转换

java - 如何从同一个java方法返回两个多维数组?

java - 数组元素,排列和识别元素

sql - 将 Oracle MERGE 语句迁移到 PostgreSQL UPSERT 语句

javascript - 在 PhantomJS 预构建中设置浏览器时区

php - 我应该如何确定 Perl 中时区的下一个夏令时 (DST) 转换?

java - 使用 switch 语句处理 fragment 中的 onBackPressed()

Java RXTX 库不加载 native 库

java - 仅从表中选择某些列

mysql - 使用 where 子句中的两个表更新 Oracle 中的表