2017-07-25 62 views
1

我的表有一個日期型列,但我需要看到GMT信息我的想法是改變時間戳列。如何更改已經有值填充的列?甲骨文變更日期到時間戳

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

謝謝大家!

回答

2

你不能沒有更改日期/ TIMESTAMP類型:

  1. 創建與現有值的臨時列;
  2. 用原始名稱創建一個新表;
  3. 填補現有的值,以「新」一欄。

轉換日期爲WITH TIME ZONE TIMESTAMP:

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; 

加:)轉換TIMESTAMP WITH 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; 
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:我沒有在我的測試數據庫的許可證,所以我不能現在測試它,但它應該工作