2017-07-25 20 views
1

私のテーブルにはDATE型の列がありますが、私の考えはタイムスタンプの列に変更されています。すでに値が入力されている列を変更するにはどうすればよいですか?Oracleの変更日時スタンプ

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

ありがとうございました!

答えて

2

あなたはなしDATE/TIMESTAMPタイプを変更することはできません。既存の値との一時的な列を作成します

  1. 元の名前で新しいテーブルを作成します。
  2. "新しい"列に既存の値を入力します。 TIME ZONE WITH TIMESTAMPへ

コンバートDATE:

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; 

プラス:) DATEにTIME ZONE WITH TIMESTAMPを変換します

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

あなたが幸運であれば十分に持っています「アドバンスト・レプリケーション」ライセンス、これを行うもう1つの方法は、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:私のテストDBにはライセンスがありません今それをテストしますが、それは動作するはずです

関連する問題