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
到此时区就已经设置正确了