2012-02-13 82 views
1

我有一個TIMESTAMP(6)與時區的Oracle列的表。該表格包含不同時區的記錄。我想將表格的所有記錄更新爲UTC。在UPDATE查詢中是否有推薦的方法?我已經看了Oracle方法to_date(),它將字符串轉換爲日期,from_tz()將time轉換爲timezone。更新Oracle表記錄時區值

看來我需要一種方法來運行查詢並從字段中拉出時區,然後以某種方式更新該字段以將其放入UTC。我不想簡單地改變時區稱號,我想彌補一天的時間,所以

21-JAN-10 03.28.38.713000000 PM -05:00 

將成爲

21-JAN-10 08.28.38.713000000 PM UTC 

CREATE TABLE "MyDb"."Books" 
    (
    "GUID" RAW(32) DEFAULT SYS_GUID(), 
    "DATE_CREATED" TIMESTAMP (6) WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, 
); 

回答

1

你應該能夠做到像

UPDATE "Books" 
    SET date_created = date_created at time zone 'UTC' 

這將做這樣的事情

SQL> create table foo(col1 timestamp with time zone); 

Table created. 

SQL> insert into foo values(current_timestamp); 

1 row created. 

SQL> select * from foo; 

COL1 
--------------------------------------------------------------------------- 
13-FEB-12 01.38.42.372000 PM -05:00 

SQL> update foo 
    2  set col1 = col1 at time zone 'UTC'; 

1 row updated. 

SQL> select * from foo; 

COL1 
--------------------------------------------------------------------------- 
13-FEB-12 06.38.42.372000 PM UTC 

現在,作爲一個風格問題,創建區分大小寫的表名和列名字是非常不鼓勵的,因爲它會極大地惹惱那些必須維護代碼的開發者。

+0

由於我是使用該表的開發人員,我完全同意你的看法。 「書籍」僅僅是一個例子。一如既往,我們非常感謝您的Oracle專業知識。簡單的查詢 - 效果很好。 – 2012-02-13 18:55:40

+0

是否有可能有選擇地進行更新,只更新不在UTC的日期?有一些觸發器在更新行時觸發,我想盡量減少不必要的行更新。 – 2012-02-13 19:07:03

+0

我相信我可以在WHERE子句中使用to_char(DATE_CREATED,'TZH')。 – 2012-02-13 19:22:51