oracle对时区的支持比较完美了,有timestamp with time zone和timestamp with local time zone两种数据类型。所谓timestamp with time zone,也就是把时区信息保存在列数据中,而timestamp with local time zone,会将用户输入的时间转换为数据库服务器所在时区的时间,保存在列中,这样能稍稍减少一点保存的数据量。因为timestamp with local time zone中不会保存时区信息(时区与数据库服务器所在时区相同),所以当数据库中有表存在timestamp with local time zone 时,数据库不能更改时区。如果有可能将数据库跨时区迁移,最好还是用timestamp with time zone好了,该数据类型最具有扩展性。
说起时区,不得不提及几个关于timestamp的函数了:
systimestamp数据库服务器当前的时间以及时区;
localtimestamp 客户端当前时间,不包含时区;
current_timestamp 客户端当前时区,包含客户端的时区。
说了这么多,下面看个例子,为了看到例子的效果,我们首先修改客户端的时区为西五区(美国东部时间),实验当前时间为北京时间2010年01月03日早晨11点左右。
alter session set TIME_ZONE='-5:00';
然后新建一个表
CREATE TABLE TEST(ID number(2),
time_tz timestamp with time zone,
time_lc_tz timestamp with local time zone);
向表中插入几行看看:
insert into test
values (1,localtimestamp,localtimestamp);
insert into test
values (2,systimestamp,systimestamp);
insert into test
values (3,current_timestamp,current_timestamp);
insert into test
values (3,current_timestamp,current_timestamp);
insert into test
values(4,to_timestamp('2010-01-03 11:09:00','YYYY-MM-DD HH24:MI:SS'),
to_timestamp('2010-01-03 11:09:00','YYYY-MM-DD HH24:MI:SS'));
insert into test
values(5,to_timestamp_tz('2010-01-03 11:09:00 +0:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'),
to_timestamp_tz('2010-01-03 11:09:00 +0:00','YYYY-MM-DD HH24:MI:SS TZH:TZM'));
提交插入的数据:COMMIT;
在当前session查询看看:(当前session时区为-5:00)
select * from test;
IDTIME_TZTIME_LC_TZ
1
02-1月 -10 09.58.45.106141 下午 -05:00
02-1月 -10 09.58.45.106141 下午
2
03-1月 -10 10.58.45.130013 上午 +08:00
02-1月 -10 09.58