Oracle 19C学习 - 04. SQL单行函数

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

 

进行姓名匹配的时候,可是将判断的两边都转换为小写。

SELECT first_name ||'.' || last_name AS 姓名, salary AS 工资, department_id AS 部门
FROM employees
WHERE LOWER(last_name) = LOWER('&emp_name');

 

CONCAT(str1, str2): 连接两个字符串。

SELECT CONCAT(first_name, last_name) AS 姓名
FROM employees
WHERE LOWER(last_name) = 'higgins';     --姓名字段: ShelleyHiggins

 

SUBSTR(str,开始位置,截取长度): 从字符串的开始位置,截取长度为n的字符。

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 ;

Oracle 19C学习 - 04. SQL单行函数

 

 

单行函数可以嵌套任意层,执行顺序从最里层到最外层。

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

 

Oracle 19C学习 - 04. SQL单行函数

 

 

 

SELECT TO_DATE('05-MAY-21','DD-MM-RR') FROM dual;

TO_DATE('05-MAY-21'
-------------------
2021-05-05 00:00:00

SQL> SELECT TO_DATE('05-MAY-51','DD-MM-RR') FROM dual;

TO_DATE('05-MAY-51'
-------------------
1951-05-05 00:00:00

 

 

可以通过TO_DATE(‘2021-5-1’, ‘YYYY-MM-DD’) 来将字符串数据转换为日期类型数据。

 

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

 

日期函数

MONTHS_BETWEEN(DATE1, DATE2) :获取两个日期之间的月份差

SELECT CEIL(MONTHS_BETWEEN(sysdate, hire_date))
FROM employees ORDER BY 1;

 

ADD_MONTHS(DATE, n) : 在日期上增加n个月。

SELECT ADD_MONTHS(sysdate,7) FROM dual;   --02-12月-21

 

NEXT_DAY(日期, 星期几): 查找下一个星期几对应的日期。

SELECT NEXT_DAY(sysdate, '星期五') FROM dual;    --07-5月-21

 

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

 

 

日期的计算

从日期添加或者减去一个数字,得到结果的日期值。

SELECT sysdate+2 FROM dual;   --当前2021.5.2, 加2后得到04-5月 -21。

 

日期之间相减,得到之间相差的天数。

SELECT CEIL((sysdate - hire_date)/7) AS 入职周数 FROM employees;     

SELECT TO_DATE('2021-05-01','YYYY-MM-DD') - TO_DATE('2021-04-30','YYYY-MM-DD') AS 日期差异 FROM dual;

  日期差异
----------
         1

 

上一篇:说说sys_context函数


下一篇:oracle截取clob类型