一、TRUNC() 函数
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()函数没有秒的精确
/****************小数***********************/
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 } )
select extract (year from sysdate) year,
extract (month from sysdate) month,
extract (day from sysdate) day
from dual;
结果:
YEAR MONTH DAY
-------- -------- -------
2015 5 4
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
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
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 } ]
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) ] } ]
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秒