【问题标题】:Convert a "timestamp with time zone" column field to the current timezone of the server将“timestamp with time zone”列字段转换为服务器的当前时区
【发布时间】:2011-04-06 11:22:23
【问题描述】:

在 Oracle 中,如何将“带时区的时间戳”转换为服务器的当前时区?我需要动态确定服务器的当前时区是什么。

create table test_table1
(rec1 timestamp with time zone)

insert into test_table1(rec1) values (
to_timestamp_tz('1/1/1900 09:00:00 AM US/EASTERN','dd-mm-yyyy hh:mi:ss AM TZR')
)

SELECT NEW_TIME(rec1, TO_CHAR(rec1, 'TZR'), TO_CHAR(SYSTIMESTAMP, 'TZR'))
FROM test_table1

上面的示例创建了一个包含时区列的表。然后我在东部时区的表中插入一行。选择语句不起作用。我想要实现的是将 rec_1 列转换为服务器的时区并返回。

【问题讨论】:

    标签: database oracle oracle11g


    【解决方案1】:

    您可以通过以下方式获取当前系统时区 [以某种格式或其他格式]:

    select to_char(systimestamp,'TZD | TZH TZM [ TZR ]'), DBTIMEZONE
    from dual;
    

    以下内容可能有助于转换。不确定您的会话时区是否与您的数据库时区相同。

    SELECT rec1, SYS_EXTRACT_UTC(rec1), cast(rec1 as timestamp with local time zone)
    FROM test_table1
    

    当我使用 systeimestamp 时,我得到 null

    TZD 可以返回空值(例如,它知道它的偏移量,但没有得到它的“别名”)。 TZR 不应该。也许像......

    SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', to_char(systimestamp,'TZR')) 
       FROM DUAL;
    

    【讨论】:

    • 从表中提取 rec1 列是直截了当的。当我使用查询时: select to_char(rec1, 'TZD') from test_table1 我得到 'EST'/'CST' 但是当我使用 systeimestamp 我得到空值。我想以 'EST'.. 格式获取系统的当前时区,并使用 new_date 函数将其转换为东部时间。因此,如果它在东部,则同时返回,否则将被转换。
    • 我让 DBA 将 dbtimezone 设置为正确的时区 (-04:00)。现在我知道了如何将这个或数据库当前日期/时间转换为东部时区。我还想考虑夏令时。虽然使用 DTS 的 tz_offset 是 -04:00,但实际上是 -05:00。
    【解决方案2】:

    如果使用区域“TZR”而不是小时和分钟“TZH:TZM”偏移量,Oracle 将根据标准和夏令时转换时区。

    为了限定您可以使用的区域(在 11g 中不确定其他版本)

    SELECT SYSTIMESTAMP AT TIME ZONE 'US/Eastern' FROM DUAL;
    

    所使用的区域必须存储在您可以检查的数据库中

    SELECT * FROM v$timezone_names WHERE tzname LIKE 'US%';
    

    可以修改此查询以识别任何区域。

    Oracle 全球化支持手册也是一个很好的参考。

    【讨论】:

      猜你喜欢
      • 2023-01-10
      • 2012-04-04
      • 2020-09-20
      • 2011-03-14
      • 1970-01-01
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多