文中例子涉及到的表数据:
1 | SQL> select empno,ename,job, hiredate,sal,deptno,comm from lzp.emp; |
字符函数
字符串截取
1 | SQL> select substr('mrbird',3,6) from dual; |
查找子串位置
1 | SQL> select instr('mrBird','Bird') from dual; |
字符串连接
1 | /* 1. || */ |
去除空格
1 | SQL > |
去除前缀和后缀
1 | SQL > |
计算字符串长度
1 | SQL> select length('mrbird') from dual; |
initcap(首字母变大写) ,lower(变小写),upper(变大写)
1 | SQL> select initcap('mrbird') s1,lower('MRBIRD') s2,upper('mrbird') s3 from dual; |
替换
1 | SQL> select replace('mrXiaoniao','Xiaoniao','Bird') from dual; |
decode[实现if ..then 逻辑] 注:第一个是表达式,最后一个是不满足任何一个条件的值
1 | SQL> |
case[实现switch ..case 逻辑]
1 | SQL> |
十进制和ASCII互相转换
1 | SQL> select ascii('A'),chr(65) from dual; |
日期函数
TO_DATE格式(以时间: 2007-11-02 13:45:25 为例)
Year | |||
yy | two digits | 两位年 | 显示值:07 |
yyy | three digits | 三位年 | 显示值:007 |
yyyy | four digits | 四位年 | 显示值:2007 |
Month | |||
mm | number | 两位月 | 显示值:11 |
mon | abbreviated | 字符集表示 | 显示值:11月,若是英文版,显示nov |
month | spelled out | 字符集表示 | 显示值:11月,若是英文版,显示november |
Day | |||
dd | number | 当月第几天 | 显示值:02 |
ddd | number | 当年第几天 | 显示值:306 |
dy | abbreviated | 当周第几天简写 | 显示值:星期五,若是英文版,显示fri |
day | spelled out | 当周第几天全写 | 显示值:星期五,若是英文版,显示friday |
ddspth | spelled out | 当月第几天英文 | 显示值:second |
Hour | |||
hh | two digits | 12小时进制 | 显示值:01 |
hh24 | two digits | 24小时进制 | 显示值:13 |
Minute | |||
mi/mm | two digits | 60进制 | 显示值:45 |
Second | |||
ss | two digits | 60进制 | 显示值:25 |
Others | |||
Q | digit | 季度 | 显示值:4 |
WW | digit | 当年第几周 | 显示值:44 |
W | digit | 当月第几周 | 显示值:1 |
24小时格式下时间范围为: 0:00:00 - 23:59:59….
12小时格式下时间范围为: 1:00:00 - 12:59:59 ….
日期字符串相互转换
时间转字符串:
Year:
1 | SQL> |
Month:
1 | SQL> |
Day:
1 | SQL> |
Hour:
1 | SQL> |
Minute,Second略
季度,周:
1 | SQL> |
字符串转时间:
1 | SQL> select to_date('2016-09-06','yyyy-MM-dd') time from dual; |
next_day
返回下个星期的日期,day为1-7或星期日-星期六,1表示星期日,也可以用英文表示星期。
1 | SQL> select next_day(sysdate,'monday') time from dual; |
两个日期相差天数
1 | SQL> select floor(sysdate - to_date('20020405','yyyymmdd')) time from dual; |
months_between
1 | SQL> |
round [舍入到最接近的日期](day:舍入到最接近的星期日)
1 | SQL> |
计算时间差
注:oracle时间差是以天数为单位,所以换算成年月,日
1 | SQL> |
查找月的最后一天
1 | SQL> select last_day(sysdate) from dual; |
ADD_MONTHS(date,i)
对给定的日期加上给定的月,查看每个员工入职20周年
1 | SQL> select ename,add_months(hiredate,12*20) from lzp.emp; |
EXTRACT
单独获取指定时间的年或月或日
1 | SQL> select extract(year from sysdate) from dual; |
数字函数
取整函数(ceil 向上取整,floor 向下取整)
1 | SQL> select ceil(66.6) N1,floor(66.6) N2 from dual; |
取幂(power) 和 求平方根(sqrt)
1 | SQL> select power(3,2) N1,sqrt(9) N2 from dual; |
求余
1 | SQL> select mod(9,5) from dual; |
返回固定小数位数 (round:四舍五入,trunc:直接截断)
1 | SQL> select round(66.667,2) N1,trunc(66.667,2) N2 from dual; |
返回值的符号(正数返回为1,负数为-1)
1 | SQL> select sign(-32),sign(293) from dual; |
LEAST、GREATEST
两个函数都可以有多个参数值,但参数类型必须一致,返回结果是参数列表中最大或最小的值。 在比较之前,在参数列表中第二个以后的参数会被隐含的转换为第一个参数的数据类型,所以如果可以转换,则继续比较,如果不能转换将会报错。
1 | SQL> select least(1,2,3),greatest(sysdate,'01-10月-16') from dual; |
其他函数
vsize: 返回表达式所需的字节数
1 | SQL> select vsize('mrBird123') from dual; |
nvl(ex1,ex2):
ex1值为空则返回ex2,否则返回该值本身ex1(常用) 例:如果雇员没有佣金,将显示0,否则显示佣金
1 | SQL> select comm,nvl(comm,0) from lzp.emp; |
nullif(ex1,ex2):
1 | SQL> select nullif(88,88) from dual; |
nvl2(ex1,ex2,ex3) :
如果ex1不为空,显示ex2,否则显示ex3
注:部分内容来自脚本之家