1、Round:四舍五入
Round(45.926,2)→45.93
2、Trunc:截断
Trunc(45.926,2)→45.92
3、Mod:求余
Mod(1600,300)→100
dual是一个"伪表",可以用来测试函数和表达式。
Round(45.923,0)保留整数位,结果是46。
Round(45.923,-1)取整数位的第二位。就是取十位,结果是50。
Round(45.923,-2)取整数位的第三位。就是取百位,结果为0。
4、日期
oracle中日期型数据实际含有2个值:日期和时间。默认的日期格式是DD-MON-RR.
查询系统时间:select sysdate from dual;
转化系统时间:select tochar(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
日期函数:MONTH_BETWEEN 两个日期相差的月数
ADD_MONTHS 向指定日期中加上若干月数
NEXT_DAY 指定日期的下一个日期
LASTDAY 本月的最后一天
ROUND 日期四舍五入
TRUNC(日期截断)
字符控制函数
concat: 字符连接函数, 等同于 ||
select concat('Hello',' World') from dual;
substr:求母串中的某个子串
select substr('Hello World',3) from dual;
SUBSTR('H
---------
llo World
select substr('Hello World',3,5) from dual;
SUBST
-----
llo W
length和lengthb: 字符数和字节数
SQL> select length('China') 字符数, lengthb('China') 字节数 from dual;
字符数 字节数
---------- ----------
5 5
select length('中国') 字符数, lengthb('中国') 字节数 from dual;
字符数 字节数
---------- ----------
2 4
instr:在母串中,查找子串的位置
SQL> select instr('Hello World','ll') from dual;
INSTR('HELLOWORLD','LL')
------------------------
3
lpad,rpad: 左右填充
SQL> --将abcd用*填充到10位
SQL> select lpad('abcd',10,'*') 左填充, rpad('abcd',10,'*') 右填充 from dual;
左填充 右填充
---------- ----------
******abcd abcd******
trim: 去掉字符串前后指定的字符
SQL> select trim('H' from 'Hello WorldH') from dual;
TRIM('H'FR
----------
ello World
replace:字符串替换函数
SQL> select replace('Hello Wordl','l','*') from dual;
REPLACE('HE
-----------
He**o Word*
数字函数
SQL> select round(45.926,2) 四舍五入, trunc(45.926,2) 截断 ,mod(1600,300) 求于
2 from dual;
四舍五入 截断 求于
---------- ---------- ----------
45.93 45.92 100
select round(45.923,0) 整数位, round(45.923,-1) 十位,round(45.923,-2) 百位 from dual;
整数位 十位 百位
---------- ---------- ----------
46 50 0
已选择 1 行。
显示时间部分
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2011-09-17 14:29:17
显示昨天,今天和明天
SQL> select sysdate-1 昨天, sysdate 今天, sysdate+1 明天 from dual;
昨天 今天 明天
-------------- -------------- --------------
16-9月 -11 17-9月 -11 18-9月 -11
两个日期相减,结果为相差的天数
SQL> --查询员工信息,显示员工工龄
SQL> select empno,ename, sysdate-hiredate 天 from emp;
查询员工信息,显示员工工龄,分别按照天,星期,月显示
SQL> select empno,ename,sysdate-hiredate 天,(sysdate-hiredate)/7 星期, (sysdate-hiredate)/30 月
2 from emp;
months_between:两个日期相差的月数
SQL> select (sysdate-hiredate)/30 方式一, months_between(sysdate,hiredate) 方式二
2 from emp;
select add_months(sysdate,1) 下个月, add_months(sysdate,123) "123个月后"
2* from dual
SQL> /
下个月 123个月后
-------------- --------------
17-10月-11 17-12月-21
last_day: 某个日期当月的最后一天
SQL> select last_day(sysdate) from dual;
next_day:下周六
SQL> select next_day(sysdate,'星期五') from dual;
对日期进行四舍五入
SQL> select round(sysdate,'MONTH') 月,round(sysdate,'YEAR') from dual;
对日期进行截断
SQL> select trunc(sysdate,'MONTH') 月,trunc(sysdate,'YEAR') from dual;
隐式转换的前提:被转换对象一定是可以转换的
SQL> select * from emp where hiredate=to_date('1982-01-23','yyyy-mm-dd');
日期格式
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
查询当前日期:显示: 2011-09-17 15:12:15今天是星期六
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss"今天是"day') from dual;
查询员工信息,显示员工的编号,姓名,月薪,要求有货币代码,千位符,两位小数
SQL> --1600 -> 1,600.00
SQL> select empno,ename,to_char(sal,'L9,999.99') from emp;
通用函数
SQL> --nvl和nvl2
SQL> --nvl(exp1,exp2):当exp1为空时,返回exp2
SQL> --nvl2(exp1,exp2,exp3):当exp1为空时,返回exp3;否则返回exp2
SQL> --查询员工的年收入
SQL> select ename,sal*12+nvl2(comm,comm,0) 年收入
2 from emp;
COALESCE :找到参数列表中,第一个不为空的值
SQL> select ename,comm,sal,COALESCE(comm,sal) from emp;
select ename,job,sal 涨前工资, case job when 'PRESIDENT' then sal+1000
2 when 'MANAGER' then sal+600
3 else sal+400
4 end 涨后工资
5 from emp;
select ename,job,sal 涨前工资, decode(job,'PRESIDENT',sal+1000,
2 'MANAGER',sal+600,
3 sal+400) 涨后工资
4 from emp;