先看一条Oracle SQL语句:
select col_name
from tab_name
where col_time >= to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD')
and col_time > to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD') + 1
刚看到这条语句,我笑了:这位哥们在干什么呢,把一个日期先转化成字符串,然后又把该字符串转化为日期?
仔细一看,原来这位哥们是有事情要做的:查询当天的记录,是从当天0点0分0秒开始,一笔记录也不能错过!
这个语句有点长,可以优化下,具体的就是:Trunc和Round!
一、数字作为参数
Trunc(number[, 小数位数] :直接截取,不进行四舍五入等操作
Round(number[, 小数位数]:截取的同时,进行四舍五入操作。
小数位数:正数,0,负数
举几个例子:
// 89.98 89.99
select trunc(89.985, 2), round(89.985, 2) from dual;
// 89.9 90
select trunc(89.985, 1), round(89.985, 1) from dual;
// 89.9 89.9
select trunc(89.945, 1), round(89.945, 1) from dual;
// 89 90
select trunc(89.985, 0), round(89.985, 0) from dual;
// 89 90
select trunc(89.985), round(89.985) from dual;
// 80 90
select trunc(89.985, -1), round(89.985, -1) from dual;
// 0 100
select trunc(89.985, -2), round(89.985, -2) from dual;
例子一看就明白了,跟JAVA中的floor, round 还有几分相象!!
二、时间作娄参数
官方两个网页:
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions218.htm
http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions253.htm#i1002084
第一个网页我想说明的是用法,第二个网页就是区别了。
Trunc(date[, fmt]), Round(date[, fmt])
格式默认为日期,即为dd。
格式可以为:年,月,日,时,分,没有秒。
Trunc也是直接截取,不往高们加1操作(类似四舍五入);
Round就有可能加1了,当:
时间的月超过了7月1日,则年加1;
时间的日超过了16号,则月加1;
其它的不加。
以下也是几个例子:
select trunc(to_date('20100715-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'MM'),
round(to_date('20100715-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'MM')
from dual;
select trunc(to_date('20100716-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'MM'),
round(to_date('20100716-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'MM')
from dual;
select trunc(to_date('20100616-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'YYYY'),
round(to_date('20100616-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'YYYY')
from dual;
select trunc(to_date('20100716-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'YYYY'),
round(to_date('20100716-10:15:17', 'YYYYMMDD-HH24:MI:SS'), 'YYYY')
from dual;
select trunc(sysdate,'yyyy'), round(sysdate, 'yyyy') from dual;
select trunc(sysdate,'mm'), round(sysdate,'mm') from dual;
select trunc(sysdate,'dd'), round(sysdate,'dd') from dual;
select trunc(sysdate,'HH24'), round(sysdate,'HH24') from dual;
select trunc(sysdate,'MI'), round(sysdate,'MI') from dual;
结果,大家自己试验,条件我都准备好了,运行下就行,也让大家真正理解它们之间的区别吧!
三、回到开头
开头的那个SQL现在可以重写了:
to_date(to_char(sysdate, 'YYYY-MM-DD'), 'YYYY-MM-DD')
可以为:trunc(sysdate, 'DD'),也可以为:trunc(sysdate)
但是,根据这位哥们的意图,最好不要用round,呵呵。
本文完了~~~~~~~~