Oracle 19C学习 - 04. SQL单行函数
(本博文采用的数据库是Oracle自带的hr用户范本数据库)
SQL的函数分为:
单行函数:每行返回一个结果。
多行函数:每个处理集合返回一个结果。
字符函数
UPPER: 转换字符串到大写。
SELECT UPPER('Hello World') FROM dual; --返回HELLO WORLD
LOWER: 转换字符串到小写。
SELECT LOWER('HELLO WORLD') FROM dual; --hello world
INITCAP: 首字母大写
SELECT INITCAP('hello world') FROM dual; --Hello World
CONCAT(str1, str2): 连接两个字符串。
SELECT CONCAT(first_name, last_name) AS 姓名 FROM employees WHERE LOWER(last_name) = 'higgins'; --姓名字段: ShelleyHiggins
SUBSTR(str,开始位置,截取长度): 从字符串的开始位置,截取长度为n的字符。下标从1开始。
SELECT SUBSTR('Hello, World', 1, 5) FROM dual; --Hello
LENGTH(str) : 获取字符串的长度
SELECT LENGTH('HELLO, WORLD') FROM dual; --12
INSTR(str1, str2): 获取str2在str1的开始位置,计数从1开始。
SELECT INSTR('HELLOWORLD', 'WOR') FROM dual; --6
LPAD(str, 长度, 补位内容):将字符串从左侧补位到指定长度。
RPAD(str, 长度, 补位内容):将字符串从右侧补位到指定长度。
SELECT LPAD(salary, 8,'#') FROM employees WHERE salary > 9000 ORDER BY salary ;
单行函数可以嵌套任意层,执行顺序从最里层到最外层。
SELECT last_name, CONCAT(UPPER(SUBSTR(last_name, 1,8)),'_US') FROM employees WHERE salary > 9000 ORDER BY salary ; -- SUBSTR -> UPPER -> CONCAT的顺序执行。
数字函数
ROUND(NUM, 保留位数):将结果四舍五入到保留的位数。
SELECT ROUND(16.239,2) FROM dual; -- 16.24
TRUNC(NUM, 保留位数):将结果截取到保留的位数,不进行四舍五入。
SELECT TRUNC(16.239,2) FROM dual; -- 16.23
CEIL(NUM):返回大于等于指定数字的最小整数。
SELECT CEIL(16.239) FROM dual; --17
FLOOR(NUM):返回小于等于指定数字的最大整数。
SELECT CEIL(16.239) FROM dual; --16
MOD(被除数,除数):取余数,也就是取模操作。
SELECT MOD(5,2) FROM dual; --1
关于RR日期格式
系统中对于字段中日期的默认显示方式是采用RR日期格式。
更改字段的日期显示方式
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SELECT sysdate FROM dual; --2021-05-02 17:15:41
改为默认的RR显示方式
alter session set nls_date_format = 'dd-MON-rr'
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss'; select sysdate from dual; --2022-10-03 11:08:05 alter session set nls_date_format='dd-MON-RR'; select sysdate from dual; --03-10月-22
查看系统当前的时区、时间和时间戳
SELECT SESSIONTIMEZONE, CURRENT_DATE, CURRENT_TIMESTAMP FROM dual;
SESSIONTIMEZONE:返回当前时区。Asia/Shanghai
CURRENT_DATE:返回当前日期和时间。02-5月 -21
CURRENT_TIMESTAMP:返回当前时间戳。 02-5月 -21 05.25.09.931610000 下午 ASIA/SHANGHAI
SELECT SESSIONTIMEZONE, CURRENT_DATE, CURRENT_TIMESTAMP FROM dual; -- Asia/Shanghai / 03-10月-22 / 03-10月-22 11.12.08.012545000 下午 ASIA/SHANGHAI
日期可以进行加减操作
-- 当前日期减掉入职日期得到相差的天数 SELECT first_name, TRUNC((sysdate - hire_date) / 365) as service_year FROM employees; /* output Steven 19 Neena 17 Lex 21 */ -- 当前日期 + 2 得到后天的日期 SELECT SYSDATE + 2 AS Day_after_tomorrow FROM dual;
字符串转日期格式
可以通过TO_DATE(‘2021-5-1’, ‘YYYY-MM-DD’) 来将字符串数据转换为日期类型数据。
SELECT TO_DATE('81-4-24', 'rr-mm-dd') FROM dual;
日期函数
MONTHS_BETWEEN(DATE1, DATE2) :获取两个日期之间的月份差
-- 从我的生日到2022.10.5经历了多少个月, 497... SELECT MONTHS_BETWEEN(sysdate, to_date('81-4-24', 'rr-mm-dd')) FROM dual;
ADD_MONTHS(DATE, n) : 在日期上增加n个月。
-- 二个月后的日期 SELECT ADD_MONTHS(sysdate, 2) FROM dual;
NEXT_DAY(Date, Weekday): 从Date开始,查找下一个Weekday对应的日期。
Weekday参数可以是“星期一 .. 星期日”, 也可以数字 1(周日) - 7(周六)
SELECT NEXT_DAY(sysdate, '星期一') FROM dual;
LAST_DAY(日期) : 查找当月最后一天日期
SELECT LAST_DAY(sysdate) FROM dual; --2021-05-31 18:50:44 (当前日期2021-5-2)
ROUND(日期, 'MONTH') : 1~15日的日期,返回本月一日。16~31的日期,返回下个月一日。
ROUND(日期, 'YEAR') : 1.1~6.30的日期,返回当年1.1日。7.1~12.31的日期,返回下年的1.1日。
SELECT ROUND(TO_DATE('2021-7-1','YYYY-MM-DD'),'YEAR') FROM dual; ROUND(TO_DATE('2021 ------------------- 2022-01-01 00:00:00 SQL> SELECT ROUND(TO_DATE('2021-5-15','YYYY-MM-DD'),'MONTH') FROM dual; ROUND(TO_DATE('2021 ------------------- 2021-05-01 00:00:00
TRUNC(日期, 'MONTH') : 返回当个月的第一天日期,相对于ROUND,TRUNC不进行四舍五入。
TRUNC(日期, 'YEAR') : 返回年的第一天日期,相对于ROUND,TRUNC不进行四舍五入。
SELECT TRUNC(TO_DATE('2021-5-31','YYYY-MM-DD'),'MONTH') FROM dual; TRUNC(TO_DATE('2021 ------------------- 2021-05-01 00:00:00 SQL> SELECT TRUNC(TO_DATE('2021-12-31','YYYY-MM-DD'),'YEAR') FROM dual; TRUNC(TO_DATE('2021 ------------------- 2021-01-01 00:00:00
posted on 2021-05-02 19:28 LeoZhangJing 阅读(235) 评论(0) 编辑 收藏 举报