Oralce中Trunc,Round截取日期,数据的用法简介

先看一条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,呵呵。

 

本文完了~~~~~~~~

你可能感兴趣的:(数据库)