2012-06-18 36 views
5

Tôi có một cặp cột không may được xác định không chính xác là TIMESTAMP(6) thay vì TIMESTAMP(6) WITH TIME ZONE. Tôi muốn di chuyển các cột từ cũ, sai datatype mới, chính xác một. Ngày đầu đó, các giá trị dường như đã được chụp trong E (S | D) T và tôi cần giá trị trong UTC.Cách cập nhật cột TIMESTAMP thành TIMESTAMP WITH TIME ZONE trong Oracle

Cho đến nay, là tốt nhất tôi nhận được là:

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; 

Thật không may, rằng lá tôi với dữ liệu mà trông giống như 15-JUN-12 05.46.29.600102000 PM -04:00, khi tôi muốn 15-JUN-12 09.46.29.600102000 PM UTC (hoặc tùy ý Oracle sẽ định dạng nó).

Tôi đã thực hiện select dbtimezone from dual; và nó hiển thị cho tôi +00:00, vì vậy tôi không chắc chắn cách tiếp tục. Lý tưởng nhất, tôi sẽ có thể làm điều này trong DML tinh khiết, và nó có tài khoản cho DST dựa trên các giá trị ngày cũ (mà tôi chắc chắn là trong múi giờ Mỹ/New_York).

Trả lời

3

Với little help from @JustinCave, tôi đến các giải pháp sau đây, mà hoàn thành chính xác những gì tôi muốn:

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

Đối với tôi, nó có vẻ tốt.

`SELECT SYS_EXTRACT_UTC(TIMESTAMP '2012-06-15 05:46:20 -04:00') FROM DUAL;` 

cho:

2012-06-15 09:46:20 

Bạn chỉ sống trong nước có sự khác biệt 4 giờ UTC.

Cũng thử một cái gì đó như:

SELECT to_char(new_column_a, 'YYYY-MM-DD HH24:MI:SS TZD'), sys_extract_utc(new_column_a) FROM oopsie_table; 
+0

Vâng, tôi đang sống trong một múi giờ đó là hiện tại là một sự bù đắp 4 giờ, nhưng tôi đã cấu hình Oracle để mặc định thành UTC (hoặc ít nhất là tôi đã thử), đó là lý do tại sao tôi đã đề cập đầu ra của 'select dbtimezone from dual;'. Tôi sẽ thử nghiệm với 'TO_CHAR' để xem liệu tôi có thể sử dụng điều đó để thay đổi định dạng của giá trị được lưu trữ trong cột mới hay không. –

Các vấn đề liên quan