商业和数据库很多时候必须跨时区工作,从9i开始,oracle环境开始有了时区意识,通过指定数据库的时区和使用TIMESTAMP WITH TIME ZONE和TIMESTAMP WITH LOCAL TIME ZONE数据类型来实现该功能。
TIMESTAMP WITH TIME ZONE不会存储数据库时区,但是有一个指示用来说明该时间所使用的时区。TIMESTAMP WITH LOCAL TIME ZONE会同时存储数据库时区,并且会根据查询客户端的时区进行相应的转换。
数据库时区可以在创建时在create database命令中设置,也可以使用alter database set TIME_ZONE=...来修改。如果没有特别的指定,默认的,数据库将遵从主机操作系统时区设置,或者取自环境变量ORA_STDZ。所有支持的时区记录在V$TIMEZONE_NAMES动态性能表中。时区有三种表示方法,全名、缩写和相对于标准时间(格林威治时间)的固定偏移,比如标准时间相应的三种表示方法分别为:Etc/Greenwich、GMT和+00:00。
下面通过一个例子来说明时区的调整的影响。
1.建立相关的表:
SQL> create table times(date_std date, date_tz timestamp with time zone,
date_ltz timestamp with local time zone);
Table created.
2.确定系统当前的时区:
SQL> select property_value from database_properties where property_name='DBTIMEZONE';
PROPERTY_VALUE
00:00
3.修改当前连接的时区,并设置相关的时间戳格式:
SQL> alter session set time_zone='Asia/Chongqing';
Session altered.
SQL> alter session set nls_timestamp_tz_format='YYYY-MM-DD HH24:MI:SS TZD:TZR';
或者
SQL> alter session set nls_timestamp_tz_format='YYYY-MM-DD HH24:MI:SS TZH';
Session altered.
SQL> alter session set nls_timestamp_format='YYYY-MM-DD HH24:MI:SS';
Session altered.
SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';
Session altered.
4.插入数据并显示:
SQL> insert into times values('2004-10-26 15:00:00',
2004-10-26 15:00:00','2004-10-26 15:00:00');
1 row created.
SQL> commit;
Commit complete.
SQL> select * from times;
DATE_STD DATE_TZ DATE_LTZI
------------------- ---------------------------------------- ------------------------------
02004-10-26 15:00:00 2004-10-26 15:00:00 CST:ASIA/CHONGQING 2004-10-26 15:00:00
5.转换当前连接的时区到数据库时区:
SQL> alter session set time_zone=DBTIMEZONE;
Session altered.
SQL> select * from times;
DATE_STD DATE_TZ DATE_LTZ
------------------- ---------------------------------------- ------------------------------
2004-10-26 15:00:00 2004-10-26 15:00:00 +08 2004-10-26 07:00:00
可以看出,timestamp with local time zone类型的字段DATE_LTZ已经根据时区的变换做出了相应的改变。