我的表有一个DATE类型列,但我需要查看GMT信息,我的想法是更改为timestamp列。如何更改已填充值的列?
create table PRO_TFESTIVO ( oid_festivo NUMBER(10) not null, fecha_hora_envio DATE to TIMESTAMP );
谢谢大家!!
答案 0 :(得分:2)
如果没有:
,则无法更改DATE / TIMESTAMP类型将DATE转换为TIMESTAMP WITH TIME ZONE:
ALTER TABLE pro_tfestivo RENAME COLUMN FECHA_HORA_ENVIO TO OLD_FECHA_HORA_ENVIO;
ALTER TABLE pro_tfestivo ADD FECHA_HORA_ENVIO TIMESTAMP WITH TIME ZONE;
UPDATE pro_tfestivo SET FECHA_HORA_ENVIO = FROM_TZ(CAST(OLD_FECHA_HORA_ENVIO AS TIMESTAMP), 'GMT');
ALTER TABLE pro_tfestivo DROP COLUMN OLD_FECHA_HORA_ENVIO;
Plus :)将TIMESTAMP与TIME ZONE转换为DATE:
ALTER TABLE pro_tfestivo RENAME COLUMN FECHA_HORA_ENVIO TO OLD_FECHA_HORA_ENVIO;
ALTER TABLE pro_tfestivo ADD FECHA_HORA_ENVIO DATE;
UPDATE pro_tfestivo SET FECHA_HORA_ENVIO = CAST(to_timestamp_tz(OLD_FECHA_HORA_ENVIO, 'dd/mm/yyyy hh24:mi:ssXFF TZR') at time zone 'GMT' AS DATE);
ALTER TABLE pro_tfestivo DROP COLUMN OLD_FECHA_HORA_ENVIO;
答案 1 :(得分:0)
如果你有足够的运气获得“高级复制”许可证,另一种方法是使用DBMS_REDEFINITION软件包
--your existing table
create table MY_SCHEMA.MY_TABLE ( START_DATE DATE );
INSERT INTO MY_TABLE VALUES (SYSDATE);
commit;
--The new Structure of your table
create table MY_TABLE_NEW ( START_DATE TIMESTAMP );
begin
dbms_redefinition.start_redef_table(
uname=>'MY_SCHEMA',
orig_table =>'MY_TABLE',
int_table =>'MY_TABLE_NEW',
col_mapping =>'cast(START_DATE as timestamp) START_DATE',
options_flag =>dbms_redefinition.cons_use_rowid);
end;
/
exec dbms_redefinition.finish_redef_table('MY_SCHEMA','MY_TABLE','MY_TABLE_NEW');
之后,您的原始表(将其名称保持为MY_TABLE)应该将其列从DATE更改为TIMESTAMP,并且所有数据都是即时转换的。优点是您的原始表在此过程中可供其他应用程序使用,因此您可以在生产中执行此操作而不会中断服务
PS:我的测试数据库上没有许可证,所以我现在无法测试,但应该可以使用