最近在百度知道看到有同學問到Oracle中的Date和 TimeStamp兩種數據類型的區別,簡單一句話就是兩者關於時間的粒度不同。
平時我們說到時間會首先想到year,month,day,hour,minute,second,也就是在我們生活中精確到這些時間基本都可以將具體問題解釋清楚,但是在計算機中特別是多任務系統,在時間片的粒度遠遠小於我們生活中的時間粒度,所有為了標示計算機中的事件的粒度,Oracle引進了TimeStamp數據類型。該類型粒度小到可以說明計算機中事件的發生前后。
現在就采用Oracle中的實踐來說明兩個數據類型的區別。
1.登錄Scott用戶,創建TimeStamp_Test

SQL> connect scott/tiger
已連接。
SQL> show user;
USER 為 "SCOTT"
SQL> CREATE TABLE Timestamp_Test(
2 Time DATE,
3 Timestamp TIMESTAMP(3),
4 TimestampWTZ TIMESTAMP(3) WITH TIME ZONE,
5 TimestampWLTZ TIMESTAMP(3) WITH LOCAL TIME ZONE,
6 Interval INTERVAL DAY TO SECOND
7 );
表已創建。
SQL>
此時表創建成功,使用了Time,TimeStamp,TimeStampWTZ,TimeStampWTLZ,Interval 五個時間的基本數據類型
2.查詢DBTIMEZONE,SESSIONZONE在系統中的設置。

SQL> desc TIMESTAMP_TEST;
名稱 是否為空? 類型
----------------------------------------- -------- ----------------------------
TIME DATE
TIMESTAMP TIMESTAMP(3)
TIMESTAMPWTZ TIMESTAMP(3) WITH TIME ZONE
TIMESTAMPWLTZ TIMESTAMP(3) WITH LOCAL TIME
ZONE
INTERVAL INTERVAL DAY(2) TO SECOND(6)
SQL>
SQL> SELECT DBTIMEZONE,SESSIONTIMEZONE FROM DUAL;
DBTIME
------
SESSIONTIMEZONE
--------------------------------------------------
+00:00
+08:00
可以發現數據庫的時區和會話發起的時區是不同的。
3.向TimeStamp_Test中插入數據

SQL> INSERT INTO TIMESTAMP_TEST VALUES(SYSDATE,SYSDATE,SYSDATE,SYSDATE,'+06 03:30:16.000000');
已創建 1 行。
創建成功。
4.查看TimeStamp_test中的數據
SQL> select time from timestamp_test;
TIME
--------------
05-2月 -12
SQL> select timestampwtz from timestamp_test;
TIMESTAMPWTZ
-------------------------------------------------
05-2月 -12 09.32.54.000 下午 +08:00
SQL> select timestampwtlz from timestamp_test;
select timestampwtlz from timestamp_test
*
第 1 行出現錯誤:
ORA-00904: "TIMESTAMPWTLZ": 標識符無效
SQL> select timestampwltz from timestamp_test;
TIMESTAMPWLTZ
-------------------------------------------------
05-2月 -12 09.32.54.000 下午
SQL> select interval from timestamp_test;
INTERVAL
-------------------------------------------------
+06 03:30:16.000000
SQL>
5.更改SessionTimeZone
SQL> alter session set TIME_ZONE='+12:00';
會話已更改。
6.查看修改后各種數據類型的值

SQL> select * from timestamp_test;
TIME
--------------
TIMESTAMP
---------------------------------------------------------------------------
TIMESTAMPWTZ
---------------------------------------------------------------------------
TIMESTAMPWLTZ
---------------------------------------------------------------------------
INTERVAL
---------------------------------------------------------------------------
05-2月 -12
05-2月 -12 09.32.54.000 下午
05-2月 -12 09.32.54.000 下午 +08:00
TIME
--------------
TIMESTAMP
---------------------------------------------------------------------------
TIMESTAMPWTZ
---------------------------------------------------------------------------
TIMESTAMPWLTZ
---------------------------------------------------------------------------
INTERVAL
---------------------------------------------------------------------------
06-2月 -12 01.32.54.000 上午
+06 03:30:16.000000
SQL>
實驗完成
總結:
從以上實驗可以看出 各種數據類型的區別 TimeStamp在總體的時間粒度小於 Date,但是TimeStamp在不同的時區,其值也用所不同。