2010-03-23 73 views
1

我需要執行遷移日期 - >時區與時區類似的描述:Migrating Oracle DATE columns to TIMESTAMP with timezone。 但我需要做額外的轉換(需要與傳統應用程序正常工作):對於所有日期,我們需要將時區更改爲UTC並將時間設置爲12:00 PM。 所以現在日期存儲在本地數據庫(紐約)時區。我需要這樣轉換它們Oracle:爲列設置時區

25/12/2009 09:12 AM(本地時區)在日期列=> 25/12/2009 12:00 PM UTC時間戳與本地時區列。您是否可以建議,如何在Oracle中設置日期值的時區(我發現只有建議如何從一個時區轉換到另一個時區)(例如在Java中,有Calendar對象的setTimeZone方法)。

我們希望做一個皈依這種方式:

  1. 重命名舊日期欄NAME_BAK
  2. 用於設置時區不空值創建新列的時間戳與本地時區
  3. 疊代舊列UTC,時間到下午12:00
  4. 降舊列此遷移

回答

0

創建並填充新列...

SQL> alter table t23 
    2  add new_col timestamp(3) with time zone 
    3/

Table altered. 

SQL> update t23 
    2  set new_col = col3 
    3/

7 rows updated. 

SQL> select to_char(new_col,'DD-MON-YYYY HH24:MI:SS.FF3 TZR') new_col 
    2 from t23 
    3/

NEW_COL 
---------------------------- 
22-MAR-2010 03:20:58.000 PST 
21-MAR-2010 03:20:58.000 PST 
20-MAR-2010 03:20:58.000 PST 
19-MAR-2010 03:20:58.000 PST 
18-MAR-2010 03:20:58.000 PST 
17-MAR-2010 03:20:58.000 PST 
16-MAR-2010 03:20:58.000 PST 

7 rows selected. 

SQL> 

所以現在COL3的值設置到了中午UTC或GMT,我們英國人(和Oracle)知道:

SQL> alter session set time_zone = 'GMT' 
    2/

Session altered. 

SQL> update t23 
    2  set col3 = 
    3   cast(to_char(col3, 'DD-MON-YYYY')||'12:00:00' as timestamp) at time zone sessiontimezone 
    4/

7 rows updated. 

SQL> 

讓我們來看看結果:

SQL> alter session set time_zone = 'PST' 
    2/

Session altered. 

SQL> select to_char(new_col,'DD-MON-YYYY HH24:MI:SS.FF3 TZR') as orig_val 
    2   , to_char(col3,'DD-MON-YYYY HH24:MI:SS.FF3 TZR') as upd_val 
    3 from t23 
    4/

ORIG_VAL      UPD_VAL 
---------------------------- ---------------------------- 
22-MAR-2010 03:20:58.000 PST 22-MAR-2010 12:00:00.000 GMT 
21-MAR-2010 03:20:58.000 PST 21-MAR-2010 12:00:00.000 GMT 
20-MAR-2010 03:20:58.000 PST 20-MAR-2010 12:00:00.000 GMT 
19-MAR-2010 03:20:58.000 PST 19-MAR-2010 12:00:00.000 GMT 
18-MAR-2010 03:20:58.000 PST 18-MAR-2010 12:00:00.000 GMT 
17-MAR-2010 03:20:58.000 PST 17-MAR-2010 12:00:00.000 GMT 
16-MAR-2010 03:20:58.000 PST 16-MAR-2010 12:00:00.000 GMT 

7 rows selected. 

SQL> 

剩下要做的就是丟棄備份列...

SQL> alter table t23 drop column new_col 
    2/

Table altered. 

SQL> 

儘管如果它是一個大桌子,您可能更喜歡將其設置爲UNUSED,然後在較慢的時間內放下它。

0

您可能希望測試後閱讀有關Oracle數據類型的文檔:

  • a DATE列沒有時區,此信息不會與此數據類型一起存儲。
  • a TIMESTAMP WITH LOCAL TIME ZONE列與數據庫具有相同的時區偏移量。您無法爲此類型的列指定不同的偏移量。

它不同於TIMESTAMP WITH TIME ZONE在存儲在數據庫中的數據歸一化到數據庫時區,以及時區偏移量不被存儲作爲列數據的一部分。當用戶檢索數據時,Oracle將其返回到用戶的本地會話時區。時區偏移量是當地時間與UTC(格林威治標準時間之前的協調通用時間)之間的差異(以小時和分鐘爲單位)。此數據類型可用於在雙層應用程序中的客戶端系統的時區中顯示日期信息。

如果你想存儲時區,你將不得不使用數據類型TIMESTAMP WITH TIME ZONE

您將一個日期轉換爲時間戳與to_timestamp_tz功能,例如:

SQL> WITH DATA AS (
    2  SELECT to_date('25/12/2009 09:12 AM', 'DD/MM/YYYY HH:MI AM') dd FROM dual 
    3 ) 
    4 SELECT dd, 
    5   to_timestamp_tz(to_char(dd, 'YYYYMMDD')||' GMT', 'YYYYMMDD TZR') tz 
    6 FROM DATA; 

DD   TZ 
----------- ------------------------------------------------- 
25/12/2009 25/12/09 00:00:00,000000000 GMT