Oracle将日期更改为时间戳

时间:2017-07-25 16:11:42

标签: database oracle

我的表有一个DATE类型列,但我需要查看GMT信息,我的想法是更改为timestamp列。如何更改已填充值的列?

create table PRO_TFESTIVO ( oid_festivo NUMBER(10) not null, fecha_hora_envio DATE to TIMESTAMP );

谢谢大家!!

2 个答案:

答案 0 :(得分:2)

如果没有:

,则无法更改DATE / TIMESTAMP类型
  1. 使用现有值创建临时列;
  2. 使用原始名称创建一个新表格;
  3. 将现有值填入" new"列。
  4. 将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:我的测试数据库上没有许可证,所以我现在无法测试,但应该可以使用