一、Oracle中的Round和Trunc:
如同对数字进行四舍五入和按位截取一样,Oracle对时间日期也提供了这两种功能。但比起对数字进行四舍五入和截取比较复杂:这是因为时间日期是有格式的。下面看看这两个函数的定义和用途:
ROUND(date [, format])
TRUNC(date [, format])
round四舍五入算法
round(带小时分秒日期, 格式)
格式是 秒SS,精确到秒。
分MI,到分,秒数30是分界线,相当于四舍五入的5,如果秒超过30,向前进1
时HH,如果分超过30,向前进1
日DD, 如果小时超过12,向前进1
月MM,16号是临界,相当于四舍五入的5,如果超过16号,向前进1
年YY,超过7月,向前进1
操作实例如下
--对年操作
select round(to_date('2012-06-30','yyyy-mm-dd'),'yyyy') round_year from dual;--2012-1-1 year
selectround(to_date('2012-07-01','yyyy-mm-dd'), 'yyyy') round_year fromdual;--2013-1-1 year
--对月操作
selectround(to_date('2012-02-16','yyyy-mm-dd'), 'mm') round_year from dual;--2012-3-1month
selectround(to_date('2012-02-15','yyyy-mm-dd'), 'mm') round_year from dual;--2012-2-1month
--对日操作
selectround(to_date('2012-02-15 12:00:01','yyyy-mm-dd hh:mi:ss'), 'dd') round_yearfrom dual;--2012-2-16
selectround(to_date('2012-02-15 11:59:59','yyyy-mm-dd hh:mi:ss'), 'dd') round_yearfrom dual;--2012-2-15
--对时操作
selectround(to_date('2012-02-15 11:30:01','yyyy-mm-dd hh:mi:ss'), 'hh') round_yearfrom dual;--2012-2-15 12:00:00
selectround(to_date('2012-02-15 11:29:59','yyyy-mm-dd hh:mi:ss'), 'hh') round_yearfrom dual;--2012-2-15 11:00:00
--对分操作
selectround(to_date('2012-02-15 13:30:01','yyyy-mm-dd hh24:mi:ss'), 'hh') round_yearfrom dual;--2012-2-15 14:00:00
selectround(to_date('2012-02-15 1:30:01','yyyy-mm-dd hh:mi:ss'), 'hh') round_yearfrom dual;--2012-2-15 2:00:00
--对day操作
selectsysdate,round(sysdate-1, 'day') round_year from dual;-- 2012-12-26 17:27:53 2012-12-23
selectsysdate,round(sysdate, 'day') round_year from dual;-- 2012-12-26 17:28:16 2012-12-30
select sysdate,round(sysdate+1,'day') round_year from dual; -- 2012-12-26 17:28:16 2012-12-30
结果分析星期三是分界线大于或等于星期三即显示日期所在星期的下一个星期日,否则显示所在星期的星期一
Round函数对日期进行“四舍五入”,Trunc函数对日期进行截取。如果我们不指定格式的话,Round会返回一个最接近date参数的日期,而Trunc函数只会简单的截取时分秒部分,返回年月日部分。
二、Round和Trunc函数示例:
selectto_char(sysdate, ' yyyy-mm-dd hh24:mi:ss ') now_date,
to_char(Round(sysdate), ' yyyy-mm-ddhh24:mi:ss ') round_date,
to_char(Trunc(sysdate), ' yyyy-mm-ddhh24:mi:ss ') trunc_date
from dual;
结果
NOW_DATE ROUND_DATE TRUNC_DATE
1 2012-12-2616:37:07 2012-12-2700:00:00 2012-12-2600:00:00
这是一个典型的例子,由于我们没有指定round和trunc函数的格式,所以Oracle默认采用了按日期时间的格式,该例子中当前的时间是下午 14:52分,已经超过了12:00 AM这个中界线,所以Round返回07-01日而非06-30日。而Trunc不管三七二十一直接截取前面日期部分返回。
另外一个值得注意的地方是这两个函数返回的时分秒都是00:00:00,即一天的开始时间(对于12小时制的返回的是12:00:00 AM)。
结果
NOW_DATE ROUND_DATE TRUNC_DATE
1 2012-12-2604:40:24 2012-12-2712:00:00 2012-12-2612:00:00
三、指定格式的Round和Trunc函数示例:
如果我们对Round函数和Trunc函数指定了格式,事情就变得有点复杂了,不过核心思想还是不变:Round是四舍五入,Trunc是截取。举个例子来说,假如我们以年为格式,则现在Oracle的判断是基于年来判断,超过一年的一半(即6月30日),Round函数则返回下一年了,Trunc函数依然返回当前年。
select sysdate"Now date",
Round(sysdate, 'yyyy') Round_year,
Trunc(sysdate, 'yyyy') Trunc_year
from dual;
结果:
Nowdate ROUND_YEAR TRUNC_YEAR
1 2012-12-2617:12:32 2013-1-1 2012-1-1
关于这两个函数可用的格式非常多,但日常应用中用得比较多的基本上就这几个,以Round函数为例:
select sysdate,
Round(sysdate, 'Q') Rnd_Q,
Round(sysdate, 'Month') Rnd_Month,
Round(sysdate, 'WW') Rnd_Week,
Round(sysdate, 'W') Rnd_Week_again,
Round(sysdate, 'DDD') Rnd_day,
Round(sysdate, 'DD') Rnd_day_again,
Round(sysdate, 'DAY') Rnd_day_of_week,
Round(sysdate, 'D')Rnd_day_of_week_again,
Round(sysdate, 'HH12') Rnd_hour_12,
Round(sysdate, 'HH24') Rnd_hour_24,
Round(sysdate, 'MI') Rnd_minute
from dual;
贴入图片 显示
四、用trunc函数处理日期
日期用例 '2008-11-2812:59:59'周五
1.没有fmt部分时
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:00:01','YYYY-MM-DD hh24:mi:ss')) FROM DUAL;
结果: 2008-11-28
2.得到最当前日期之前的最近的一个周日的日期
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'D') FROM DUAL;
结果: 2008-11-23周日
语句: SELECT TRUNC(TO_DATE('2008-11-2812:59:59','YYYY-MM-DD hh24:mi:ss'),'D')+1 FROM DUAL;
结果: 2008-11-24周一
3.得到最当前日期的所在月份的第一天
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM') FROM DUAL;
结果: 2008-11-1
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'MM')-1
结果: 2008-10-31
4.得到最当前日期的所在年份的第一天
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y') FROM DUAL;
结果: 2008-1-1
语句: SELECT TRUNC(TO_DATE('2008-11-28 12:59:59','YYYY-MM-DD hh24:mi:ss'),'Y')-1
结果: 2007-12-31
标签:sysdate,00,12,round,Oracle,Trunc,Round,2012 From: https://blog.51cto.com/u_1481758/7524821