在 Oracle 的所有类型中,和日期时间有关的类型只有一个: Date,字面上看,是日期类型,其实它是包括时间的,确切的说应该是DateTime.我们从以下几方面来了解一下Date的相关知识:
第一.Date类型的组成
不管你同意与否,Date类型总是包括时间的.如果没有指定时间,就默认为午夜12:00:00
例如:
SQL> conn hr/hr
已连接。
SQL> create table t
2 (d date)
3 tablespace users;
表已创建。
SQL> insert into t values (to_date('2006-11-15','yyyy-mm-dd'));
已创建 1 行。
SQL> select * from t;
D
----------
15-11月-06
之所以显示成 "15-11月-06"这种格式,与Oracle的参数nls_date_format有关系,执行以下的命令:
SQL>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。
日期时间格式改变以后,再执行刚才的语句:
SQL> select * from t;
D
-------------------
2006-11-15 00:00:00
可以看出,日期中是含有时间的.并且是"00:00:00".
第二:Date 的长度
Date从公元前4712年1月1日到公元4712年12月31日,所以不用担心日期会到期.
第三.Date 的格式化显示
在不同的应用的地方,Date可能要求有不同的显示格式.
如:yyyy年mm月dd日,还有先显示月日,再显示年的.
SQL> select to_char(d, 'yyyy"年"mm"月"dd"日"') "日期" from t;
日期
--------------
2006年11月15日
第四:忽略Date中时间,主要用于日期的比较.
Date中始终是含有时间的,但是有的时候,我们不需要时间,只需要日期,这时就需要忽略时间.
SQL> insert into t values (sysdate);
已创建 1 行。
SQL> select * from t;
D
-------------------
2006-11-15 00:00:00
2006-11-15 23:03:55
SQL> select trunc(d) from t;
TRUNC(D)
-------------------
2006-11-15 00:00:00
2006-11-15 00:00:00
不忽略时间时:
SQL> select * from t where d<=to_date('2006-11-15','yyyy-mm-dd');
D
-------------------
2006-11-15 00:00:00
忽略时间时:
SQL> select * from t where trunc(d)<=to_date('2006-11-15','yyyy-mm-dd');
D
-------------------
2006-11-15 00:00:00
2006-11-15 23:03:55
第五: Date相关的运算
由于Date的特殊性,它只能做一部分的运算.
如:只能做两个Date的减运算,一个Date和整形的加(减)运算.
SQL> select (d-to_date('2006-11-15','yyyy-mm-dd'))*24 from t;
(D-TO_DATE('2006-11-15','YYYY-MM-DD'))*24
-----------------------------------------
0
23.0652778
两日期相减后得到的结果单位是天.上面的结果已换算成小时.
SQL> select d+1 from t;
D+1
-------------------
2006-11-16 00:00:00
2006-11-16 23:03:55
SQL> select d+32 from t;
D+32
-------------------
2006-12-17 00:00:00
2006-12-17 23:03:55
加或减去一段时间后,会自动的换算到别的日期.
SQL> select d-46 from t;
D-46
-------------------
2006-09-30 00:00:00
2006-09-30 23:03:55
最后,
SQL> truncate table t;
表已截掉。
SQL> drop table t;
表已丢弃。