【问题标题】:Extracting time zone from Oracle JDBC TIMEZONETZ object从 Oracle JDBC TIMEZONETZ 对象中提取时区
【发布时间】:2010-10-28 03:42:18
【问题描述】:

有没有办法直接从oracle.sql.TIMESTAMPTZ 对象(从TIMESTAMP WITH TIME ZONE 列中选择)提取时区信息?

理想情况下,我希望能够直接从对象中提取时区信息,而无需跳过潜在的昂贵或脆弱的圈子(例如将内容转换为字符串并解析它们)。

您会认为有一种简单的方法可以做到这一点,但我还没有找到。 Oracle 的文档不是很有帮助。它声称TIMESTAMPTZ#toBytes()返回的最后两个字节编码了时区信息,但没有描述我们实际解码此信息。

有没有人有处理这些东西的经验?

【问题讨论】:

    标签: sql oracle datetime jdbc timezone


    【解决方案1】:

    Oracle 为这些元素提供了特定的日期格式元素:TZD、TZH、TZM 和 TZR。

    一个例子:

    SQL> create table t (col timestamp with time zone)
      2  /
    
    Tabel is aangemaakt.
    
    SQL> insert into t values (sysdate)
      2  /
    
    1 rij is aangemaakt.
    
    SQL> select col
      2       , to_char(col,'TZD') time_zone_daylight_info
      3       , to_char(col,'TZH') time_zone_hour
      4       , to_char(col,'TZM') time_zone_minute
      5       , to_char(col,'TZR') time_zone_region
      6    from t
      7  /
    
    COL                             TIME_Z TIM TI TIME_ZONE_REGION
    ------------------------------- ------ --- -- --------------------------------
    22-05-09 09:12:33,000000 +02:00        +02 00 +02:00    
    
    1 rij is geselecteerd.
    

    或者使用 EXTRACT 函数:

    SQL> select col
      2       , extract(timezone_abbr from col)   time_zone_abbr
      3       , extract(timezone_hour from col)   time_zone_hour
      4       , extract(timezone_minute from col) time_zone_minute
      5       , extract(timezone_region from col) time_zone_region
      6    from t
      7  /
    
    COL                             TIME_ZONE_                         TIME_ZONE_HOUR                       TIME_ZONE_MINUTE
    ------------------------------- ---------- -------------------------------------- --------------------------------------
    TIME_ZONE_REGION
    ----------------------------------------------------------------
    22-05-09 09:15:24,000000 +02:00 UNK                                             2                                      0
    UNKNOWN
    
    
    1 rij is geselecteerd.
    

    【讨论】:

    • 谢谢。我认为没有使用格式元素或提取函数的方法可以做到这一点(即,我有一个现有的应用程序我想让时区感知,如果我能在不改变的情况下做到这一点会很好所有现有的 SQL 语句)?
    • 我不知道。这篇文章似乎暗示了同样的事情:stackoverflow.com/questions/223096?sort=oldest。你当然可以套用中文方法:设置所有可能的时区信息,看最后两个字节...
    【解决方案2】:

    TIMESTAMPTZ 的格式是well documented。我们目前使用the following code提取时区信息。

    如果你使用的是 Java SE 8,你可以使用getObject(int, OffsetDateTime.class),如果你使用getObject(int, ZonedDateTime.class),你可能会受到bug 25792016的影响。

    【讨论】:

      猜你喜欢
      • 2018-12-15
      • 2017-09-08
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      相关资源
      最近更新 更多