【问题标题】:How to update a TIMESTAMP column to TIMESTAMP WITH TIME ZONE in Oracle如何在 Oracle 中将 TIMESTAMP 列更新为 TIMESTAMP WITH TIME ZONE
【发布时间】:2012-06-18 20:59:09
【问题描述】:

不幸的是,我有一对列被错误地定义为TIMESTAMP(6) 而不是TIMESTAMP(6) WITH TIME ZONE。我想将这些列从旧的错误数据类型迁移到新的正确数据类型。最重要的是,这些值似乎已在 E(S|D)T 中捕获,我需要 UTC 中的值。

到目前为止,我得到的最好的是:

alter table OOPSIE_TABLE add (
    NEW_COLUMN_A timestamp(6) with time zone,
    NEW_COLUMN_B timestamp(6) with time zone
);
update OOPSIE_TABLE set
    NEW_COLUMN_A = COLUMN_A,
    NEW_COLUMN_B = COLUMN_B
;
alter table OOPSIE_TABLE drop column (
    COLUMN_A,
    COLUMN_B
);
alter table OOPSIE_TABLE rename column NEW_COLUMN_A to COLUMN_A;
alter table OOPSIE_TABLE rename column NEW_COLUMN_B to COLUMN_B;

不幸的是,当我想要 15-JUN-12 09.46.29.600102000 PM UTC(或者 Oracle 会对其进行格式化)时,这给我留下了看起来像 15-JUN-12 05.46.29.600102000 PM -04:00 的数据。

我已经完成了select dbtimezone from dual;,它显示了+00:00,所以我不知道如何继续。理想情况下,我可以在纯 DML 中执行此操作,并根据旧日期值(我确定在 America/New_York 时区)将 DST 考虑在内。

【问题讨论】:

    标签: oracle timezone timestamp data-migration ddl


    【解决方案1】:

    通过little help from @JustinCave,我得到了以下解决方案,它完全实现了我想要的:

    -- Rename the old columns so we can use them as a data source *AND* so
    -- we can roll back to them if necessary.
    alter table OOPSIE_TABLE rename column COLUMN_A to OLD_COLUMN_A;
    alter table OOPSIE_TABLE rename column COLUMN_B to OLD_COLUMN_B;
    -- Define COLUMN_A and COLUMN_B to have TIME ZONE support.
    alter table OOPSIE_TABLE add (
        COLUMN_A timestamp(6) with time zone,
        COLUMN_B timestamp(6) with time zone
    );
    -- Populate the "new" columns with the adjusted version of the old data.
    update OOPSIE_TABLE set
        COLUMN_A = from_tz(OLD_COLUMN_A, 'America/New_York') at time zone 'UTC',
        COLUMN_B = from_tz(OLD_COLUMN_B, 'America/New_York') at time zone 'UTC'
    ;
    

    【讨论】:

      【解决方案2】:

      对我来说看起来不错。

      `SELECT SYS_EXTRACT_UTC(TIMESTAMP '2012-06-15 05:46:20 -04:00') FROM DUAL;`
      

      给予:

      2012-06-15 09:46:20
      

      您只是住在与 UTC 相差 4 小时的国家/地区。

      也可以试试:

      SELECT to_char(new_column_a, 'YYYY-MM-DD HH24:MI:SS TZD'), sys_extract_utc(new_column_a) FROM oopsie_table;
      

      【讨论】:

      • 是的,我确实生活在一个当前偏移 4 小时的时区,但我已将 Oracle 配置为默认为 UTC(或者至少我尝试过),这就是我提到输出的原因select dbtimezone from dual;。我将尝试使用TO_CHAR,看看是否可以使用它来更改存储在新列中的值的格式。
      猜你喜欢
      • 2023-01-10
      • 2012-04-04
      • 2020-09-20
      • 1970-01-01
      • 2019-12-31
      • 2011-03-14
      • 2011-05-03
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多