首页 > 数据库 >Oracle中的Round和Trunc函数区别

Oracle中的Round和Trunc函数区别

时间:2023-09-19 14:03:44浏览次数:30  
标签:sysdate 00 12 round Oracle Trunc Round 2012


 

一、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操作

Oracle中的Round和Trunc函数区别_四舍五入

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;

贴入图片 显示

Oracle中的Round和Trunc函数区别_四舍五入_02


四、用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

相关文章

  • 无涯教程-JavaScript - ROUND函数
    描述ROUND函数将数字四舍五入为指定的位数。ROUND是Excel舍入函数之一。语法ROUND(number,num_digits)争论Argument描述Required/OptionalnumberThenumberthatyouwanttoround.Requirednum_digitsThenumberofdigitstowhichyouwanttoroundthenum......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)(A-D)
    CodeTONRound6(Div.1+Div.2,Rated,Prizes!)A.让你找mex为k的n个数,这n个数从0-x,问n个数的和最大值是多少先判断不行的。然后行的肯定有0-k-1,剩下还有就选x就行。查看代码#include<iostream>usingnamespacestd;typedeflonglongll;voidsolve(){ intn,k,x;......
  • win10 按键盘偶尔会出现一个光圈when pressing ctrl, randomly a white circle thing
    whenpressingctrl,randomlyawhitecirclethingappearsaroundmymousecurser.SolutionTwo:Thisonlyappliesifyouhave"Powertoys"installed. OpenPowertoysNavigateto'Mouseutilities'onthesidepanel.Turnoff'......
  • 《基础语法篇》trunc的使用
    日期selectsysdatefromdual--当时日期selecttrunc(sysdate)fromdualselecttrunc(sysdate,'DD')fromdual--今天日期selecttrunc(sysdate,'d')+7fromdual--本周星期日selecttrunc(sysdate,'dy')+7fromdual--本周星期日selecttrunc(s......
  • hbase truncate table后没有释放空间
    HBase中的truncatetable操作会清空表中的所有数据,但不会立即释放物理存储空间。这是因为HBase使用一种称为“MajorCompaction(主要合并)”的过程来清理和释放存储空间。MajorCompaction是HBase自动执行的周期性任务,通常在后台进行。MajorCompaction将删除表中已标记为删除的数......
  • 牛客周赛 Round 12 D 小美的区间异或和
    Link首先这个题目的限制卡的很死,最好是O(n)解决,其次当看到异或的时候,就可以考虑按照二进制位进行计算。对于这个题,我们定义\(dp_i\)表示以\(a_i\)为最右端的子区间的答案的和那么首先可以想到,贡献给这个答案的有两个部分,包括\(a_i\)的和不包括的,其中不包括\(a_i\)的部分的答案......
  • Educational Codeforces Round 107
    依然是四题,但是感觉太久没打,好像变得迟钝了。B题大概就是令\[c={10}^k,a=c*3^k,b=c*2^k\]C的话直接暴力维护每种颜色的第一个位置就行,反正只有50个D的话刚开始没什么想法,构造题什么的真的不会啊打表之后发现,对于k,在cost为0的情况下,最多能造出长度为\(k^2+1\)的串,也就是能够......
  • oracle11g_获取所有对象&&表数据脚本(迁移后数据比对)
    oracle11g进行数据库迁移后,数据比对靠人工的话比较麻烦,通过如下脚本可以直接取数,获取对象及数据结果文件后,通过notpad++即可进行对比脚本内容如下--------------------------------------------------------------------------------------------------------------------------......
  • oracle19c(CDB模式)_获取所有对象&&表数据脚本(迁移后数据比对)
    oracle19c进行数据库迁移后,数据比对靠人工的话比较麻烦,通过如下脚本可以直接取数,获取对象及数据结果文件后,通过notpad++即可进行对比脚本内容如下--------------------------------------------------------------------------------------------------------------------------......
  • Oracle OCP 19c认证考试1Z0-082题库最新解析 第十四题
    14.ExaminethedescriptionoftheSATES1tableSALES2isatablewiththesamedescriptionasSALES1SomesalesdataiscontainederroneouslyinbothtablesYoumustdisplayrowsfromSALES1andSALES2andwishtoseetheduplicatestooWhichsetoperatorge......