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


發佈了168 篇原創文章 · 獲贊 16 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章