如何在 Oracle 中将时间戳列更新为带时区的时间戳



不幸的是,我有一对列被错误地定义为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 05.46.29.600102000 PM -04:00的数据,当我想要15-JUN-12 09.46.29.600102000 PM UTC时(或者 Oracle 会如何格式化它)。

我已经完成了select dbtimezone from dual;,它向我显示了+00:00,所以我不确定如何进行。理想情况下,我将能够在纯DML中执行此操作,并使其基于旧的日期值(我确定在美国/New_York时区)考虑DST。

在@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'
;
对我来说,

它看起来不错。

`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;

相关内容

  • 没有找到相关文章

最新更新