数值型函数
ROUND
TRUNC
MOD
CEIL
power
ROUND(列名|表达式,n)
四舍五入到小数点后的n位
idle> select round(458.734,0),round(458.734,1),round(458.734,-1) from dual;
ROUND(458.734,0) ROUND(458.734,1) ROUND(458.734,-1)
---------------- ---------------- -----------------
459 458.7 460
idle>
TRUNC(列名|表达式,n)
截取到小数点后的n位
idle> select trunc(458.734,0),trunc(458.734,1),trunc(458.734,-1) from dual
TRUNC(458.734,0) TRUNC(458.734,1) TRUNC(458.734,-1)
---------------- ---------------- -----------------
458 458.7 450
idle>
MOD(m,n)
求m除以n的余数
idle> select mod(10,3) from dual;
MOD(10,3)
----------
1
idle>
idle> select mod(3,10) from dual;
MOD(3,10)
----------
3
idle>
CEIL 取整 向上补1 和trunc相反
idle> select ceil(457.001) from dual; 后面只要有小数,就进一
CEIL(457.001)
-------------
458
idle>
power(底数,指数) 求次方
SQL> select power(10,3) from dual;
POWER(10,3)
-----------
1000
SQL>
日期函数
日期函数的处理
如果你对当前系统的日期格式 看这不舒服 可以修改当前会话的显示格式
idle> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
Session altered.
idle> select sysdate from dual;
SYSDATE
-------------------
2010-12-17 08:52:31
idle> 这是OS系统时间 数据库本身没时间 只有SCN号
日期可以直接参与运算
idle> select sysdate-10 from dual;
SYSDATE-10
-------------------
2010-12-07 08:53:16
两个日期型数据相减会得到相差的天数
idle> select to_date('2010-12-30')-sysdate from dual;
TO_DATE('2010-12-30')-SYSDATE
-----------------------------
12.6290856
idle>
可以将日期型的数据和一个小时数相加减 这个数要除以24
idle> select sysdate from dual;
SYSDATE
-------------------
2010-12-17 08:55:56
idle> select sysdate + 5/24 from dual;
SYSDATE+5/24
-------------------
2010-12-17 13:55:56
idle>
计算scott的工龄
idle> select ename,(sysdate-hiredate)/365 "years" from emp where ename='SCOTT';
ENAME years
---------- ----------
SCOTT 23.6804732
日期函数的处理
如果你对当前系统的日期格式 看这不舒服 可以修改当前会话的显示格式
idle> alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
Session altered.
idle> select sysdate from dual;
SYSDATE
-------------------
2010-12-17 08:52:31
idle> 这是OS系统时间 数据库本身没时间 只有SCN号
日期可以直接参与运算
idle> select sysdate-10 from dual;
SYSDATE-10
-------------------
2010-12-07 08:53:16
两个日期型数据相减会得到相差的天数
idle> select to_date('2010-12-30')-sysdate from dual;
TO_DATE('2010-12-30')-SYSDATE
-----------------------------
12.6290856
idle>
可以将日期型的数据和一个小时数相加减 这个数要除以24
idle> select sysdate from dual;
SYSDATE
-------------------
2010-12-17 08:55:56
idle> select sysdate + 5/24 from dual;
SYSDATE+5/24
-------------------
2010-12-17 13:55:56
idle>
计算scott的工龄
idle> select ename,(sysdate-hiredate)/365 "years" from emp where ename='SCOTT';
ENAME years
---------- ----------
SCOTT 23.6804732
idle>
日期型函数
MONTHS_BETWEEN
ADD_MONTHS
NEXT_DAY
LAST_DAY
ROUND 和 TRUNC 对日期的取舍
MONTHS_BEWTEEN(日期1,日期2)
如果日期1大于日期2返回正数,日期1小于日期2返回负数
idle> select months_between('2010-10-10','2010-12-10') from dual;
MONTHS_BETWEEN('2010-10-10','2010-12-10')
-----------------------------------------
-2
idle> select months_between('2010-12-10','2010-10-10') from dual;
MONTHS_BETWEEN('2010-12-10','2010-10-10')
-----------------------------------------
2
idle>
ADD_MONTHS(日期,n)
把n个月加到日期上
idle> select add_months('2010-10-10',3) from dual;
ADD_MONTHS('2010-10
-------------------
2011-01-10 00:00:00
idle>
NEXT_DAY(日期,星期)
从当天算起,求下一个指定星期几是几号. 如果是中文系统将MONDAY改成"星期一"
idle> select next_day(sysdate,'MONDAY') from dual;
NEXT_DAY(SYSDATE,'M
-------------------
2010-12-20 09:02:06
idle>
idle> select next_day(sysdate,'fri') from dual;
NEXT_DAY(SYSDATE,'F
-------------------
2010-12-24 09:02:44
idle>
LAST_DAY(日期)
返回该日期的所在月的最后一天
idle> select last_day(sysdate) from dual;
LAST_DAY(SYSDATE)
-------------------
2010-12-31 09:03:26
idle>
idle> alter session set nls_date_format='YYYY-MM-DD';
Session altered.
idle> select ename,hiredate,last_day(hiredate),next_day(hiredate,'SUN'),months_between(sysdate,hiredate) "MON",ADD_MONTHS(hiredate,3) from emp
where ename='SCOTT';
ENAME HIREDATE LAST_DAY(H NEXT_DAY(H MON ADD_MONTHS
---------- ---------- ---------- ---------- ---------- ----------
SCOTT 1987-04-19 1987-04-30 1987-04-26 283.947709 1987-07-19
idle>
月
1-31
15
日
0-23:59
12
ROUND(date,'[day|month|year]') 和 trunc(date,'[day|month|year]') 应用于日期型数据
数字的进位和截取是以小数点为中心,而日期的进位和截取是以年月日时分秒为中心
idle> select round('2010-10-10','MONTH') from dual;
select round('2010-10-10','MONTH') from dual
*
ERROR at line 1:
ORA-01722: invalid number
因为round不能处理字符型数据,所以报错,我们要将字符型数据转换为日期型
idle> select round(to_date('2010-10-10'),'MONTH') from dual;
ROUND(TO_DATE('2010
-------------------
2010-10-01 00:00:00
idle>
这是按月为单位进行四舍五入 因为10号是16号以前 所以得到10.1日
月为单位的四舍五入的分割线
idle> select round(to_date('2010-10-15'),'MONTH'),trunc(to_date('2010-10-15')) from dual;
ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-10-01 00:00:00 2010-10-15 00:00:00
idle> select round(to_date('2010-10-16'),'MONTH'),trunc(to_date('2010-10-16')) from dual;
ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-11-01 00:00:00 2010-10-16 00:00:00
idle>
年为单位的四舍五入分割线
idle> select round(to_date('2010-06-30'),'year'),trunc(to_date('2010-06-30'),'year') from dual;
ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2010-01-01 00:00:00 2010-01-01 00:00:00
idle> select round(to_date('2010-07-01'),'year'),trunc(to_date('2010-07-01'),'year') from dual;
ROUND(TO_DATE('2010 TRUNC(TO_DATE('2010
------------------- -------------------
2011-01-01 00:00:00 2010-01-01 00:00:00
idle>
DD-MON-RR
DD-MON-YY
YY 永远都引用当前年份的世纪部分补齐
13
2013
RR 13
2013 1913
RR与 YY的区别
84 -- > YY 2013 --> 2084
RR
20
如果输入的两位数是00-49:
如果当前年份属于00-49,则返回成本世纪所在年份;2020
如果当前年份属于50-99,则返回成上世纪所在年份。
如果输入的两位数是50-99:
如果当前年份属于00-49,则返回成上世纪所在年份 1984
如果当前年份属于50-99,则返回成本世界所在年份
SQL> select to_date('18-may-91','DD-MON-RR') FROM DUAL;
TO_DATE('18-MAY-91'
-------------------
1991-05-18 00:00:00
SQL> select to_date('18-may-91','DD-MON-YY') FROM DUAL;
TO_DATE('18-MAY-91'
-------------------
2091-05-18 00:00:00
SQL>
本文深入解析SQL中常用的数值函数如ROUND、TRUNC、MOD、CEIL、power及日期函数如MONTHS_BETWEEN、ADD_MONTHS、NEXT_DAY、LAST_DAY等的使用方法与应用场景,通过实例展示如何进行数值四舍五入、日期加减运算,以及如何计算日期间隔。
935

被折叠的 条评论
为什么被折叠?



