TIMESTAMP WITH TIME ZONE与TIMESTAMP WITH LOCAL TIME ZONE数据类型

TIMESTAMP WITH TIME ZONE与TIMESTAMP WITH LOCAL TIME ZONE数据类型

TIMESTAMP WITH TIME ZONE Datatype
TIMESTAMP WITH TIME ZONE is a variant of TIMESTAMP that includes a time zone offset in its value. The time zone offset is the difference (in hours and minutes) between local time and UTC (Coordinated Universal Time—formerly Greenwich Mean Time). This datatype is useful for collecting and evaluating date information across geographic regions.
TIMESTAMP WITH TIME ZONE存储时区信息。

TIMESTAMP WITH LOCAL TIME ZONE Datatype
TIMESTAMP WITH LOCAL TIME ZONE is another variant of TIMESTAMP that includes a time zone offset in its value. It differs from TIMESTAMP WITH TIME ZONE in that data stored in the database is normalized to the database time zone, and the time zone offset is not stored as part of the column data. When a user retrieves the data, Oracle returns it in the user's local session time zone. The time zone offset is the difference (in hours and minutes) between local time and UTC (Coordinated Universal Time—formerly Greenwich Mean Time). This datatype is useful for displaying date information in the time zone of the client system in a two-tier application.
TIMESTAMP WITH LOCAL TIME ZONE  将时间数据以数据库时区进行规范化后进行存储(即将时间数据转换为数据库时区的时间数据进行存储),但不存储时区信息;客户端检索时,oracle会将数据库中存储的时间数据转换为客户端session时区的时间数据后返回给客户端。


下面的例子能很好的区别TIMESTAMP WITH TIME ZONE与TIMESTAMP WITH LOCAL TIME ZONE数据类型:

SQL> select dbtimezone from dual;   --数据库时区

DBTIME
------
+00:00

SQL> select sessiontimezone from dual;  --session会话时区

SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00

SQL> create table timezone_test(id int, t1 timestamp with time zone,t2 timestamp with local time zone);

表已创建。

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
06-2月 -12 10.22.45.697000 上午 +08:00

SQL> alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS';

会话已更改。

SQL> select systimestamp from dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
06-2月 -12 10.24.13.446000 上午 +08:00

SQL> select sysdate from dual;

SYSDATE
-------------------
2012-02-06 10:24:25

SQL> insert into timezone_test values(1,TO_TIMESTAMP('2012-2-6 14:10:10.123000',
  2   'YYYY-MM-DD HH24:MI:SS.FF'),TO_TIMESTAMP('2012-2-6 14:10:10.123000', 'YYYY-MM-DD HH24:MI:SS.FF'));

已创建 1 行。

SQL>  insert into timezone_test values(2,TO_TIMESTAMP('2012-2-6 5:10:10.123000',
  2   'YYYY-MM-DD HH24:MI:SS.FF'),TO_TIMESTAMP('2012-2-6 5:10:10.123000', 'YYYY-MM-DD HH24:MI:SS.FF'));

已创建 1 行。

SQL>  insert into timezone_test values(3,TO_DATE('2012-2-6 14:10:10',
  2   'YYYY-MM-DD HH24:MI:SS'),TO_DATE('2012-2-6 14:10:10', 'YYYY-MM-DD HH24:MI:SS'));

已创建 1 行。

SQL> commit;

提交完成。

SQL> set linesize 120
SQL> col t1 for a50
SQL> col t2 for a50
SQL> select * from timezone_test;

        ID T1                                                 T2
---------- -------------------------------------------------- --------------------------------------------------
         1 06-2月 -12 02.10.10.123000 下午 +08:00             06-2月 -12 02.10.10.123000 下午
         2 06-2月 -12 05.10.10.123000 上午 +08:00             06-2月 -12 05.10.10.123000 上午
         3 06-2月 -12 02.10.10.000000 下午 +08:00             06-2月 -12 02.10.10.000000 下午

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
---------------------------------------------------------------------------
+08:00

--设置不同的时区,观察两种数据类型的区别。
SQL> alter session set time_zone='+06:00';  

会话已更改。

SQL> select * from timezone_test;

        ID T1                                                 T2
---------- -------------------------------------------------- --------------------------------------------------
         1 06-2月 -12 02.10.10.123000 下午 +08:00             06-2月 -12 12.10.10.123000 下午
         2 06-2月 -12 05.10.10.123000 上午 +08:00             06-2月 -12 03.10.10.123000 上午
         3 06-2月 -12 02.10.10.000000 下午 +08:00             06-2月 -12 12.10.10.000000 下午

SQL> alter session set time_zone='+08:00';

会话已更改。

SQL> select * from timezone_test;

        ID T1                                                 T2
---------- -------------------------------------------------- --------------------------------------------------
         1 06-2月 -12 02.10.10.123000 下午 +08:00             06-2月 -12 02.10.10.123000 下午
         2 06-2月 -12 05.10.10.123000 上午 +08:00             06-2月 -12 05.10.10.123000 上午
         3 06-2月 -12 02.10.10.000000 下午 +08:00             06-2月 -12 02.10.10.000000 下午

SQL> alter session set time_zone='+09:00';

会话已更改。

SQL> select * from timezone_test;

        ID T1                                                 T2
---------- -------------------------------------------------- --------------------------------------------------
         1 06-2月 -12 02.10.10.123000 下午 +08:00             06-2月 -12 03.10.10.123000 下午
         2 06-2月 -12 05.10.10.123000 上午 +08:00             06-2月 -12 06.10.10.123000 上午
         3 06-2月 -12 02.10.10.000000 下午 +08:00             06-2月 -12 03.10.10.000000 下午

SQL> alter session set time_zone='+07:00';

会话已更改。

SQL> select * from timezone_test;

        ID T1                                                 T2
---------- -------------------------------------------------- --------------------------------------------------
         1 06-2月 -12 02.10.10.123000 下午 +08:00             06-2月 -12 01.10.10.123000 下午
         2 06-2月 -12 05.10.10.123000 上午 +08:00             06-2月 -12 04.10.10.123000 上午
         3 06-2月 -12 02.10.10.000000 下午 +08:00             06-2月 -12 01.10.10.000000 下午

SQL>

参考:

http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i53219


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值