【问题标题】:Where to find Oracle Time Zone regionids?在哪里可以找到 Oracle 时区 regionid?
【发布时间】:2020-07-22 14:13:18
【问题描述】:

Oracle 内置过程 dbms_utility.get_tz_transitions 定义为

DBMS_UTILITY.GET_TZ_TRANSITIONS( 
   regionid      IN     NUMBER,
   transitions   OUT    MAXRAW);

并按 regionid 返回时区转换。

但是:regionid 在哪里定义/记录? IE。欧洲/柏林的 regionid 是什么 - 或 v$timezone_names 中的任何 tzname-values 是什么?

有什么想法吗?

【问题讨论】:

    标签: oracle plsql timezone timestamp-with-timezone


    【解决方案1】:

    由于时区是全球的一个区域,它为法律、商业和社会目的遵守统一的标准时间,并倾向于遵循国家及其细分的边界,因此 Oracle 仅将这些标准值关联到用于编程目的的视图中.将其视为关于 V$TIME_ZONES 的元数据表。

    https://www.timeanddate.com/time/zones/

    区域 id 是从 timezone.dat 文件中检索到的,但您提到的过程最后会输出原始数据。

    SQL> set serveroutput on
    
    DECLARE
     r RAW(22);
    BEGIN
      dbms_utility.get_tz_transitions(10, r);
      dbms_output.put_line(r);
    
      dbms_utility.get_tz_transitions(12, r);
      dbms_output.put_line(r);
    END;
    /SQL> SQL>   2    3    4    5    6    7    8    9   10
    01766401010101011A3C00
    0176640101010101183C00
    
    PL/SQL procedure successfully completed.
    
    SQL>
    

    Oracle 数据库时区文件包含有效的时区名称。每个时区还包括以下信息:

    • 与协调世界时 (UTC) 的偏移量
    • 夏令时的转换时间
    • 标准时间和夏令时的缩写

    Oracle 数据库主目录中包含两个时区文件。默认时区文件是

    • $ORACLE_HOME/oracore/zoneinfo/timezonelrg.dat,其中包含所有 数据库中定义的时区。
    • $ORACLE_HOME/oracore/zoneinfo/timezone.dat 仅包含最 常用时区。

    要启用 $ORACLE_HOME/oracore/zoneinfo/timezone.dat,请执行以下步骤:

    • 如果数据库已启动,请将其关闭。
    • 将 ORA_TZFILE 环境变量设置为 $ORACLE_HOME/oracore/zoneinfo/timezone.dat。
    • 重启数据库。

    更新

    $ORACLE_HOME/oracore/zoneinfo/readme.txt 文件可能就是您要查找的文件。

    Timezones updated:
    DSTVERSION TIME_ZONE_NAME FROM_YEAR TO_YEAR
    26, Asia/Novokuznetsk, 1992, 1992
    26, America/Santa_Isabel, 1800, 1800
    DSTVERSION TIME_ZONE_NAME FROM_YEAR TO_YEAR
    23, Africa/Ouagadougou, 1800,
    23, Africa/Cairo, 2014, 2022
    

    也许 DSTVERSION 指的是 region_id

    【讨论】:

    • 罗伯托,感谢您的解释。在您的示例中,您将值 10 和 12 作为 regionid 提供给 get_tz_transitions(),但是这些值的时区是什么?我正在寻找的是时区名称或缩写的区域 ID,以获取给定时区的转换数据。
    • 相信我试图在 Oracle 支持中找到这种关系,但我找不到。你在用这个包做什么?您不能使用时区 SQL 函数实现相同的功能吗?只是问
    • 一个 java 人让我帮忙解决这个问题。不知道他们为什么需要知道这一点——也许是一些 jdbc 的东西。他向我展示了一些 java 代码,其中 get_tz_transitions() 用于获取原始值并对其进行解释。这用于将 Java 时区对象转换为具有时区值的有效 Oracle 时间戳。为了支持更多时区,他们需要知道区域 ID。感谢您的研究。
    • @oratom ,我认为您要查找的信息可能在此文件中:$ORACLE_HOME/oracore/zoneinfo/readme.txt
    • 好的,我明天检查一下。
    【解决方案2】:

    我的完全随机猜测是

    regionid= (zoneidbyte1-128)*64 + (zoneidbyte2/4)
    

    您可以从具有函数dumptimestamp with time zone 字段中找到zoneidbyte1zoneidbyte2:它们是数据的最后两个字节。例如 Europe/Kievid1=134,id2=96

    请注意,它没有在任何地方记录,因此即使它是真的,也可以更改,恕不另行通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 2012-11-30
      • 2011-08-22
      • 2014-12-14
      • 2012-05-04
      • 2014-01-17
      • 2011-11-13
      相关资源
      最近更新 更多