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