timestamp

timestamp with local time zone 和timesatamp with time zone的区别; 前者在用户提交时间给数据库的时,该类型会转换成数据库的时区来保存数据,即数据库保存的时间是数据库本地时区,当别的用户访问数据库时oracle会自动将该时间转换成当前客户端的时间。转于 http://blog.163.com/zangyunling@126/blog/static/164624505201052113959538/ SQL> CREATE TABLE TIMESTAMP_TEST( 2 TIME DATE, 3 TIMESTP TIMESTAMP(3), 4 TIMESTP_TZ TIMESTAMP(3) WITH TIME ZONE, 5 TIMESTP_LTZ TIMESTAMP(3) WITH LOCAL TIME ZONE); 表已创建。 SQL> INSERT INTO TIMESTAMP_TEST VALUES(SYSDATE,SYSDATE,SYSDATE,SYSDATE); 已创建 1 行。 SQL> select dbtimezone,sessiontimezone from dual; DBTIME SESSIONTIMEZONE ------ ---------------------- +08:00 +08:00 SQL> select * from timestamp_test; TIME TIMESTP TIMESTP_TZ TIMESTP_LTZ ------------------------------------ 04-7月 -12 04-7月 -12 09.44.23.000 上午 04-7月 -12 09.44.23.000 上午 +08:00 04-7月 -12 09.44.23.000 上午 修改dbtimezone 需要重启数据库。 SQL> select dbtimezone from dual; DBTIME ------ +08:00 SQL> alter database set time_zone='+6:00'; Database altered. SQL> select dbtimezone from dual; DBTIME ------ +08:00 SQL> shutdown immediate; SQL> startup; SQL> select dbtimezone from dual; DBTIME ------ +06:00 查看数据库时区信息: SQL> select dbtimezone from dual; 查看session时区信息: SQL> select sessiontimezone from dual; DATE:存储日期和时间信息,精确到秒。 SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'; Session altered. SQL> select to_date('2009-01-12 13:24:33','YYYY-MM-DD HH24:MI:SS') from dual; TO_DATE('2009-01-12 ------------------- 2009-01-12 13:24:33 TIMESTAMP:DATE类型的扩展,保留小数级别的秒,默认为小数点后6位。不保存时区和地区信息。 SQL> select localtimestamp from dual; LOCALTIMESTAMP --------------------------------------------------------------------------- 12-JAN-09 07.21.37.984000 PM TIMESTAMP WITH TIME ZONE:存储带时区信息的TIMESTAMP(以和UTC时间差或者地区信息的形式保存)。形式大致为: TIMESTAMP '2009-01-12 8:00:00 +8:00' TIMESTAMP WITH LOCAL TIME ZONE:另一种不同类型的TIMESTAMP,和TIMESTAMP WITH TIME ZONE类型的区别在于:数据库不保存时区相关信息,而是把客户端输入的时间转换为基于database timezone的时间后存入数据库 (这也就是database tmiezone设置的意义所在,作为TIMESTAMP WITH LOCAL TIME ZONE类型的计算标尺)。当用户请求此类型信息时,Oracle把数据转换为用户session的时区时间返回给用户。所以Oracle建议把database timezone设置为标准时间UTC,这样可以节省每次转换所需要的开销,提高性能。 操作TIMESTAMP WITH LOCAL TIME ZONE数据类型: SQL> ALTER SESSION SET TIME_ZONE='-07:00'; SQL> CREATE TABLE table_tsltz (c_id NUMBER, c_tsltz TIMESTAMP WITH LOCAL TIME ZONE); SQL> INSERT INTO table_tsltz VALUES(1, '01-JAN-2009 2:00:00'); SQL> INSERT INTO table_tsltz VALUES(2, TIMESTAMP '2009-01-01 2:00:00'); SQL> INSERT INTO table_tsltz VALUES(3, TIMESTAMP '2009-01-01 2:00:00 -08:00'); SQL> commit; SQL> select * from table_tsltz; --------------------------------------------------------------------------- 1 01-JAN-09 02:00:00.000000 2 01-JAN-09 02:00:00.000000 3 01-JAN-09 03:00:00.000000 Note:插入的第三条数据指定为UTC-8时区的时间,然后存入数据库后按照database timezone的时间保存,最后在客户端请求的时候,转换为客户端时区的时间(UTC-7)返回!可以参考以下简单实验: SQL> ALTER SESSION SET TIME_ZONE='-05:00'; SQL> select * from table_tsltz; --------------------------------------------------------------------------- 1 01-JAN-09 04:00:00.000000 2 01-JAN-09 04:00:00.000000 3 01-JAN-09 05:00:00.000000 可以看出,当客户端时区改为UTC-5的时候,TIMESTAMP WITH LOCAL TIME ZONE数据类型的返回信息是会相应改变的。 在了解了相关数据类型后,那么我们该如何在它们之间做出选择呢? 当你不需要保存时区/地区信息的时候,选择使用TIMESTAMP数据类型,因为它一般需要7-11bytes的存储空间,可以节省空间。 当你需要保存时区/地区信息的时候,请选择使用TIMESTAMP WITH TIME ZONE数据类型。比如一个跨国银行业务应用系统,需要精确纪录每一笔交易的时间和地点(时区),在这种情况下就需要纪录时区相关信息。因为需要纪录时区相关信息,所以需要多一些的存储空间,一般需要13bytes。 当你并不关心操作发生的具体地点,而只是关心操作是在你当前时区的几点发生的时候,选择使用 TIMESTAMP WITH LOCAL TIME ZONE。比如一个全球统一的change control system。用户可能只关心某某操作是在我的时间几点发生的(比如中国用户看到的是北京时间8:00am,而伦敦的用户看到的是0:00am)。记住,此类行不保存时区/地区信息,因此如果需要保存相关信息的要慎重![@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14181270/viewspace-1059355/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14181270/viewspace-1059355/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值