gpt4 book ai didi

oracle - 如何在 Oracle 中将 TIMESTAMP 列更新为 TIMESTAMP WITH TIME ZONE

转载 作者:行者123 更新时间:2023-12-04 19:14:45 31 4
gpt4 key购买 nike

不幸的是,我有一对列被错误地定义为 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 中执行此操作,并根据旧日期值(我确定在 America/New_York 时区)考虑 DST。

最佳答案

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

关于oracle - 如何在 Oracle 中将 TIMESTAMP 列更新为 TIMESTAMP WITH TIME ZONE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11090932/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com