Oracle (TRUNC,ROUND、MOD、EXTRACT、INTERVAL )函数的使用

Oracle (TRUNC,ROUND、MOD、EXTRACT )函数的使用

一、TRUNC() 函数

  • 1、对日期的操作
    语法格式:TRUNC(date,fmt)
    其中: date 一个日期值
    fmt 日期格式,该日期将由指定的元素格式所截去。忽略它则由最近的日期截去
SELECT TRUNC(SYSDATE) FROM DUAL; --2019/11/29 今天的日期为2019/11/29
SELECT TRUNC(SYSDATE, 'MM') FROM DUAL; --2019/11/01 返回当月第一天.
SELECT TRUNC(SYSDATE,'YY') FROM DUAL; --2019/11/01 返回当年第一天
SELECT TRUNC(SYSDATE,'YYYY') FROM DUAL; --2019/01/01 返回当年第一天
SELECT TRUNC(SYSDATE,'DD') FROM DUAL; --2019/11/29 返回当前年月日
SELECT TRUNC(SYSDATE,'D') FROM DUAL; --2019/11/24 (星期天)返回当前星期的第一天
SELECT TRUNC(SYSDATE, 'HH24') FROM DUAL; --2019/11/29 17:00:00 当前时间为17:11
SELECT TRUNC(SYSDATE, 'MI') FROM DUAL; --2019/11/29 17:11:00 TRUNC()函数没有秒的精确
  • 2、对数字的操作
    语法格式:TRUNC(number,decimals)   其中: number 待做截取处理的数值
      decimals 需要保留小数点后面的位数。可选项,忽略它则截去所有的小数部分   注意:
    第二个参数可以为负数,表示为小数点左边指定位数后面的部分截去,即均以0记。
    与取整类似,比如参数为1即取整到十分位,如果是-1,则是取整到十位,以此类推。
/****************小数***********************/
SELECT TRUNC(123.458,-4) FROM DUAL; --0
SELECT TRUNC(123.458,-3) FROM DUAL; --0
SELECT TRUNC(123.458,-2) FROM DUAL; --100
SELECT TRUNC(123.458,-1) FROM DUAL; --120
SELECT TRUNC(123.458) FROM DUAL; --123
SELECT TRUNC(123.458,1) FROM DUAL; --123.4
SELECT TRUNC(123.458,2) FROM DUAL; --123.45
SELECT TRUNC(123.458,3) FROM DUAL; --123.458
SELECT TRUNC(123.458,4) FROM DUAL; --123.458
/****************整数***********************/
SELECT TRUNC(123,-4) FROM DUAL; --0
SELECT TRUNC(123,-3) FROM DUAL; --0
SELECT TRUNC(123,-2) FROM DUAL; --100
SELECT TRUNC(123,-1) FROM DUAL; --120
SELECT TRUNC(123) FROM DUAL; --123
SELECT TRUNC(123,1) FROM DUAL; --123
SELECT TRUNC(123,2) FROM DUAL; --123

二、ROUND()函数
语法: ROUND(x[,y])
功能: 四舍五入函数,y缺省值为0,x保留整数;
y>0,x保留小数点右边y位;
y<0,x保留小数点左边 |y| 位;
可以对时间进行round,效果是只保留年月日。

SELECT ROUND (55.655, 2) FROM DUAL;  --55.66
SELECT ROUND (55.654, 2) FROM DUAL;  --55.65
SELECT ROUND (45.654, -1) FROM DUAL; --50
SELECT ROUND (45.654, -2) FROM DUAL; --0
SELECT ROUND (55.654, -2) FROM DUAL; --100

TRUNC函数和ROUND函数区别: TRUNC函数返回处理后的数值,其工作机制与ROUND函数极为类似,只是该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去。
三、MOD 函数 
语法格式:MOD (m,n)
其中: (1) MOD 返回m/n的余数,如果 n 为 0,则返回 m
(2) 这个函数以任何数字数据类型或任何非数值型数据类型为参数,可以隐式地转换为数字数据类型。

 SELECT MOD (12,5) FROM DUAL; -- 2  因为12/5结果为2余2,所以输出结果:2
 SELECT MOD (12,-5) FROM DUAL; -- 2  
 SELECT MOD (-12,5) FROM DUAL; -- -2
 --Oracle用最高的数字优先级来确定参数,隐式地将剩下的参数转换为该数据类型,并返回数据类型。

四、EXTRACT() 函数
用途:从一个date或者interval类型中截取到特定的部分
语法格式:
EXTRACT (
{ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND }
| { TIMEZONE_HOUR | TIMEZONE_MINUTE }
| { TIMEZONE_REGION | TIMEZONE_ABBR }
FROM { date_value | interval_value } )

  • 1、date类型中截取年月日
select  extract (year from sysdate) year, 
		extract (month from sysdate) month, 
		extract (day from sysdate) day 
from  dual;
结果:
	 YEAR      MONTH    DAY
	-------- -------- -------
	 2015       5        4
  • 2、从timestamp中获取年月日时分秒
select 
	extract(year from systimestamp) year,
	extract(month from systimestamp) month,
	extract(day from systimestamp) day,
	extract(minute from systimestamp) minute,
	extract(second from systimestamp) second,
	extract(timezone_hour from systimestamp) th,
	extract(timezone_minute from systimestamp) tm,
	extract(timezone_region from systimestamp) tr,
	extract(timezone_abbr from systimestamp) ta
from dual

结果:在这里插入图片描述

  • 3 获取两个日期之间的具体时间间隔
select
    extract (day from dt2 - dt1) day,
    extract (hour from dt2 - dt1) hour,
    extract (minute from dt2 - dt1) minute,
    extract (second from dt2 - dt1) second
from
    (
        select
            to_timestamp ('2021-06-27 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1,
            to_timestamp ('2021-07-26 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
        from dual
    )
结果:
	  DAY     hour    minute    second
	------- -------  --------  --------
	  29       4        1    	  46
  • 4、获取interval类型特定部分
select extract(year from interval '21' year) year from dual

五、INTERVAL时间间隔
语法格式:
1、INTERVAL YEAR TO MONTH,年份和月份之间必须有- 包含年、月的一段时间的间隔
INTERVAL ‘integer [- integer ]’ { YEAR | MONTH } [ (precision) ] [ TO { YEAR | MONTH } ]

  • 1、"integer [-integer]"指定前导和可选的尾随字段的整型值。如果前导的字段是年份,而尾随字段是月,月字段的整数值范围为0到11。
  • 2、“precision” 指定前导字段的最大位数。前导字段精度的有效范围为0到9,其默认值为2。
    前导列的限制: 如果您指定了一个尾随字段,那么它就必须小于前导字段。
    例如,INTERVAL '0-1’月到YEAR是无效的。
select sysdate,sysdate +  interval '1' year from dual;--当前时间+1年
select sysdate,sysdate+numtoyminterval(1,'year') as res from dual;--当前时间+1年
select sysdate,sysdate +  interval '1-0' year to month from dual;--当前时间+1年
select sysdate,sysdate +  interval '1-1' year to month from dual;--当前时间+1年1月
select sysdate,sysdate +  interval '100' year(3) from dual; --当前时间+100年
select sysdate,sysdate +  interval '100-1' year(3) to month from dual; --当前时间+100年1月

select sysdate,sysdate +  interval '100' year(2) from dual;--报错ORA-01873: 间隔的前导精度太小,因为100是3位数,而2只指定了两位
select sysdate,sysdate +  interval '100-1' year(2) to month from dual;--报错 ORA-01873: 间隔的前导精度太小, 因为100是3位数,而2只指定了两位

2、INTERVAL DAY TO SECOND
包含天、小时、分钟、秒的一段时间的间隔
INTERVAL ‘{ integer | integer time_expr | time_expr }’
{ { DAY | HOUR | MINUTE } [ (leading_precision) ]
| SECOND [ (leading_precision [, fractional_seconds_precision ]) ]}
[ TO { DAY | HOUR | MINUTE | SECOND [ (fractional_seconds_precision) ] } ]

  • 1、"integer"指定天数。如果这个值包含的数字超过了主要精度指定的数字,那么Oracle将返回一个错误。
  • 2、"time_expr"指定格式HH:MI:SS的时间。
select sysdate,sysdate+1 from dual;--当前时间+1天
select sysdate,sysdate +  interval '1' day from dual;--当前时间+1天
select sysdate,sysdate+numtodsinterval(1,'day') as res from dual;--当前时间+1天
select sysdate,sysdate +  interval '1 0' day to hour from dual;--当前时间+1天
select sysdate,sysdate +  interval '1 1' day to hour from dual;--当前时间+1天1小时
select sysdate,sysdate +  interval '1 01:01' day to minute from dual;--当前时间+1天1小时1分钟
select sysdate,sysdate +  interval '1 01:01:01' day to second from dual;--当前时间+1天1小时1分钟1秒

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