Oracle函数练习题
题目及参考答案:
-- 单行函数:只有一个参数输入,只有一个结果输出
-- 多行函数或分组函数:可有多个参数输入,只有一个结果输出
-- 测试lower/upper/initcap函数,使用dual哑表
select lower('abc Def GHI') from dual; --abc def ghi
select upper('abc Def GHI') from dual; --ABC DEF GHI
select initcap('abc Def GHI') from dual; --Abc Def Ghi
-- 测试concat/substr函数,从1开始,表示字符,不论中英文
select concat('abc','一二三') from dual; --abc一二三
select 'abc' || '一二三' || '哈吼' from dual; --abc一二三哈吼
select concat('abc',concat('一二三','哈吼')) from dual; --abc一二三哈吼
select substr('abc一二三',3,3) from dual; --c一二
-- 测试length函数,一个英文一个字节
select length('abc一二三') from dual; --6
-- 测试instr/lpad/rpad函数,从左向右找第一次出现的位置,从1开始
select instr('abcdefg','e') from dual; --5
select LPAD('abc',6,'*') from dual; --***abc
select RPAD('abc',6,'*') from dual; --abc***
-- 测试trim/replace函数
select trim(' ' from ' abc a ') from dual; --abc a
select replace('aaBBccAADDee','c','A') from dual; --aaBBAAAADDee
-- 测试round/trunc/mod函数作用于数值型
select round(1.12345,3) from dual; --1.123
select trunc(1.12345,3) from dual; --1.123
select mod(10,3) from dual; --1
-- 当前日期:sysdate
select to_char(sysdate, 'yyyy-mm-dd') from dual; --2019-03-12
-- 测试round作用于日期型(month)
select round(sysdate, 'month') from dual; --2019/3/1
-- 测试round作用于日期型(year)
select round(sysdate, 'year') from dual; --2019/1/1
-- 测试trunc作用于日期型(month)
select trunc(sysdate, 'month') from dual; --2019/3/1
-- 测试trunc作用于日期型(year)
select trunc(sysdate, 'year') from dual; --2019/1/1
-- 显示昨天,今天,明天的日期,日期类型 +- 数值 = 日期类型
select sysdate-1 "昨天", sysdate "今天", sysdate+1 "明天" from dual; --2019/3/11 10:55:53 | 2019/3/12 10:55:53 | 2019/3/13 10:55:53
-- 以年和月形式显示员工近似工龄,日期-日期=数值,假设:一年以365天计算,一月以30天计算
select ename "姓名", round(sysdate-hiredate,0)/365 "天数" from emp; --SMITH | 38.2575342465753 ......
-- 使用months_between函数,精确计算到年底还有多少个月
select months_between('31-12月-19', sysdate) from dual; --9.59805630227001
-- 使用months_between函数,以精确月形式显示员工工龄
select ename "姓名", months_between(sysdate, hiredate) "员工工龄" from emp; --SMITH | 458.853571535245 ......
-- 测试add_months函数,下个月今天是多少号
select add_months(sysdate,1) from dual; --2019/4/12 11:04:33
-- 测试add_months函数,上个月今天是多少号
select add_months(sysdate,-1) from dual; --2019/2/12 11:05:32
-- 测试next_day函数,从今天开始算,下一个星期三是多少号
select next_day(sysdate, '星期三') from dual; --2019/3/13 11:06:25
-- 测试next_day函数,从今天开始算,下下一个星期三是多少号
select next_day(next_day(sysdate, '星期三'), '星期三') from dual; --2019/3/20 11:08:35
-- 测试next_day函数,从今天开始算,下一个星期三的下一个星期日是多少号
select next_day(next_day(sysdate, '星期三'), '星期日') from dual; --2019/3/17 11:09:12
-- 测试last_day函数,本月最后一天是多少号
select last_day(sysdate) from dual; --2019/3/31 11:11:09
-- 测试last_day函数,本月倒数第二天是多少号
select last_day(sysdate)-1 from dual; --2019/3/30 11:11:21
-- 测试last_day函数,下一个月最后一天是多少号
select last_day(add_months(sysdate,1)) from dual; --2019/4/30 11:11:31
-- 测试last_day函数,上一个月最后一天是多少号
select last_day(add_months(sysdate,-1)) from dual; --2019/2/28 11:12:01
-- 注意:
-- 1)日期-日期=天数
-- 2)日期+-天数=日期
---------三大类型转换
-- oracle中三大类型与隐式数据类型转换
-- (1)varchar2变长/char定长-->number,例如:'123'->123
-- (2)varchar2/char-->date,例如:'25-4月-15'->'25-4月-15'
-- (3)number---->varchar2/char,例如:123->'123'
-- (4)date------>varchar2/char,例如:'25-4月-15'->'25-4月-15'
-- oracle如何隐式转换:
-- 1)=号二边的类型是否相同
-- 2)如果=号二边的类型不同,尝试的去做转换
-- 3)在转换时,要确保合法合理,否则转换会失败,例如:12月不会有32天,一年中不会有13月
-- 查询1980年12月17日入职的员工(方式一:日期隐示式转换)
select * from emp where hiredate = '17-12月-80'; --7369 | SMITH | CLERK | 7902 | 1980/12/17 | 800.00 | | 20
-- 使用to_char(日期,'格"常量"式')函数将日期转成字符串,显示如下格式:2015 年 04 月 25 日 星期六
select to_char(sysdate,'yyyy" 年 "mm"月 "dd"日 "day') from dual; --2019 年 03月 12日 星期二
-- 使用to_char(日期,'格式')函数将日期转成字符串,显示如格式:2015-04-25今天是星期六 15:15:15
select to_char(sysdate,'yyyy-mm-dd"今天是"day hh24:mi:ss') from dual; --2019-03-12今天是星期二 11:13:50
-- 使用to_char(数值,'格式')函数将数值转成字符串,显示如下格式:$1,234
select to_char(1234,'$9,999') from dual; -- $1,234
-- 使用to_char(数值,'格式')函数将数值转成字符串,显示如下格式:¥1,234select to_char(1234,'$9,999') from dual;
select to_char(1234,'L9,999') from dual; --¥1,234