oracle時區問題
今天突然發現oracle數據庫時區不對,所以通過查找各種資料來解決了,特寫下供以後碰到類似問題時方便處理。
--查看當前數據庫系統的時區
SQL> select dbtimezone from dual;
DBTIME
------
+00:00
--查看當前數據庫的時間
SQL> select to_char
2 (sysdate,'yyyymmdd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'
-----------------
20121017 16:58:26
--修改時區
SQL> alter database set time_zone='+8:00';
alter database set time_zone='+8:00'
*
ERROR at line 1:
ORA-30079: cannot alter database timezone when database has TIMESTAMP WITH LOCAL TIME ZONE columns
主要問題就是因爲上面紅色字體標註,即使用了本地時區列,爲了查找這個列,查了不少資料。
--查找有問題的表
SQL> select u.name || '.' || o.name || '.' || c.name
2 TSLTZcolumn from sys.obj$ o, sys.col$ c, sys.user$ u
3 where c.type# = 231 and o.obj# = c.obj# and u.user# = o.owner#;
TSLTZCOLUMN
--------------------------------------------------------------------------------
OE.ORDERS.ORDER_DATE
就是上面這個這個表中的列採用了 timestamp with local timezone
--查看oe.orders表的屬性
SQL> desc oe.orders
Name Null? Type
----------------------------------------- -------- ----------------------------
ORDER_ID NOT NULL NUMBER(12)
ORDER_DATE NOT NULL TIMESTAMP(6) WITH LOCAL TIME
ZONE
ORDER_MODE VARCHAR2(8)
CUSTOMER_ID NOT NULL NUMBER(6)
ORDER_STATUS NUMBER(2)
ORDER_TOTAL NUMBER(8,2)
SALES_REP_ID NUMBER(6)
PROMOTION_ID NUMBER(6)
--刪除此列
SQL> alter table oe.orders drop column order_date;
Table altered.
--再次設置時區
SQL> alter database set time_zone='+8:00';
Database altered.
SQL> startup force;
ORACLE instance started.
Total System Global Area 608174080 bytes
Fixed Size 1220820 bytes
Variable Size 197136172 bytes
Database Buffers 402653184 bytes
Redo Buffers 7163904 bytes
Database mounted.
Database opened.
--再次查看時區
SQL> select dbtimezone from dual;
DBTIME
------
+08:00
到此時區就已經設置正確了