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,呵呵。

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值