最近在百度知道看到有同学问到Oracle中的Date和 TimeStamp两种数据类型的区别,简单一句话就是两者关于时间的粒度不同。
平时我们说到时间会首先想到year,month,day,hour,minute,second,也就是在我们生活中精确到这些时间基本都可以将具体问题解释清楚,但是在计算机中特别是多任务系统,在时间片的粒度远远小于我们生活中的时间粒度,所有为了标示计算机中的事件的粒度,Oracle引进了TimeStamp数据类型。该类型粒度小到可以说明计算机中事件的发生前后。
现在就采用Oracle中的实践来说明两个数据类型的区别。
1.登录Scott用户,创建TimeStamp_Test
View Code
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在系统中的设置。
View Code
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中插入数据
View Code
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.查看修改后各种数据类型的值
View Code
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在不同的时区,其值也用所不同。