(课堂笔记)Oracle 常用函数:数值、字符串、日期处理

本文系统总结了Oracle常用函数,分为数值、字符串和日期处理三大类。


数值函数包括ABS、POWER、ROUND等;字符串函数涵盖REPLACE、SUBSTR、INSTR等;日期函数包含LAST_DAY、ADD_MONTHS等。


文中提供了典型示例和实用技巧,如统计字符出现次数、模糊查询替代方案等。


最后通过综合练习演示了函数组合应用,并给出了最佳实践建议,如日期运算优先使用MONTHS_BETWEEN、字符串拼接推荐使用"||"等。


这些函数为Oracle数据库操作提供了强大的数据处理能力。


课堂笔记

根据你提供的课堂笔记内容,以下是对 Oracle 常用函数 的系统总结与梳理,分为 数值处理、字符串处理、日期处理 三大类,并附有典型示例和练习思路。


一、数值函数(针对 NUMBER 类型)

函数 说明 示例
ABS(x) 绝对值 SELECT ABS(-3.4) FROM DUAL;
POWER(x, y) x 的 y 次幂 SELECT POWER(4,2) FROM DUAL;
ROUND(x, y) 四舍五入保留 y 位小数 SELECT ROUND(-3.4567,2) FROM DUAL;
FLOOR(x) 向下取整 SELECT FLOOR(-3.567) FROM DUAL;
CEIL(x) 向上取整 SELECT CEIL(3.14) FROM DUAL;
TRUNC(x, y) 截断(不四舍五入) SELECT TRUNC(3.567,2) FROM DUAL;
MOD(x, y) 取余数 SELECT MOD(7,3) FROM DUAL;

✅ 注意:TRUNC 不进行四舍五入,直接舍弃多余小数位。


二、字符串函数(针对 VARCHAR2 类型)

函数 说明 示例
REPLACE(str, old, new) 替换子串 SELECT REPLACE('ABBCCDD','B','*') FROM DUAL;
LENGTH(str) 字符串长度 SELECT LENGTH('中国') FROM DUAL;
SUBSTR(str, m, n) 从 m 位开始截取 n 位 SELECT SUBSTR('ABCDEFG',2,3) FROM DUAL;
INSTR(str, sub, m, n) 查找子串位置 SELECT INSTR('ABBDSDSKKD','D',5,2) FROM DUAL;
TRIM(str) 去除左右空格 SELECT TRIM(' A B C D ') FROM DUAL;
CONCAT(x, y) 拼接字符串 SELECT CONCAT('Hello',' World') FROM DUAL;
LPAD(str, len, pad) 左填充 SELECT LPAD('8888',8,'*') FROM DUAL;
RPAD(str, len, pad) 右填充 SELECT RPAD('8888',8,'*') FROM DUAL;

常用技巧:

  • 统计某字符出现次数
    LENGTH(str) - LENGTH(REPLACE(str, '目标字符'))

  • 模糊查询替代方案
    WHERE INSTR(ename, 'K') > 0 等价于 LIKE '%K%'

  • 字符串统一格式处理 :结合 SUBSTR + INSTR + LPAD


三、日期函数(针对 DATE 类型)

函数 说明 示例
LAST_DAY(date) 当月最后一天 SELECT LAST_DAY(SYSDATE) FROM DUAL;
ADD_MONTHS(date, n) 增加 n 个月 SELECT ADD_MONTHS(SYSDATE, -2) FROM DUAL;
MONTHS_BETWEEN(d1, d2) 月数差(小数) SELECT MONTHS_BETWEEN(...) FROM DUAL;
TRUNC(date, '格式') 截断到指定精度 TRUNC(SYSDATE,'MM') → 当月第一天
date ± n 推后/提前 n 天 SELECT SYSDATE + 10 FROM DUAL;
date1 - date2 相差天数 SELECT SYSDATE - HIREDATE FROM EMP;

常用日期截断格式:

  • 'YYYY' → 当年第一天(2026-01-01)

  • 'MM' → 当月第一天(2026-04-01)

  • 'Q' → 当季第一天(2026-04-01)

  • 'DD' → 当天(不变)

典型计算:

  • 入职月数 (向下取整):
    FLOOR(MONTHS_BETWEEN(SYSDATE, HIREDATE))

  • 入职年数
    FLOOR(MONTHS_BETWEEN(...) / 12)

  • 上季度最后一天
    TRUNC(SYSDATE,'Q') - 1


四、综合练习与典型思路

✅ 练习 1:统计字符串中 K 的个数

sql

复制代码
SELECT 
LENGTH('HBJBDKWWJJJK34K224HKN') - 
LENGTH(REPLACE('HBJBDKWWJJJK34K224HKN','K')) AS CNT 
FROM DUAL;

✅ 练习 2:姓名打码(首尾保留)

sql

复制代码
SELECT
SUBSTR(ENAME,1,1) ||
LPAD('*', LENGTH(ENAME)-2, '*') ||
SUBSTR(ENAME,-1) AS NEW_ENAME
FROM EMP;

✅ 练习 3:截至当月第一天,员工已领月薪月数

sql

复制代码
SELECT 
FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE,'MM'), HIREDATE)) AS 月数
FROM EMP;

✅ 练习 4:计算机(1970-01-01)至上季度最后一天的月数

sql

复制代码
SELECT 
FLOOR(MONTHS_BETWEEN(TRUNC(SYSDATE,'Q')-1, 
       TO_DATE('1970-01-01','YYYY-MM-DD'))) AS 月份数
FROM DUAL;

五、注意事项 & 最佳实践

  • 日期运算 优先使用 MONTHS_BETWEEN,避免手动处理天数/闰年。

  • 字符串拼接 推荐使用 ||,比 CONCAT 更灵活。

  • 去空格TRIM 只去两端,如需去全部空格用 REPLACE(str, ' ', '')

  • 日期截断常用于统计"月初"、"季初"等固定时间点。

  • Oracle 中 DUAL 是系统虚拟表,用于测试函数或常量查询。

相关推荐
arronKler2 小时前
数据库设计三大范式
数据库·oracle
oradh3 小时前
Oracle物理存储结构概述
数据库·oracle·物理结构·oracle基础·oracle入门·oracle物理存储结构概述
数据最前线4 小时前
亡羊补牢?Oracle 计划推出月度安全补丁
数据库·oracle
这个DBA有点耶5 小时前
某银行核心系统从Oracle迁移到国产数据库全程复盘(DBA视角)
数据库·经验分享·sql·oracle·dba·智能硬件
阿坤带你走近大数据5 小时前
DM达梦数据库的介绍
数据库·mysql·oracle·国产信创
我科绝伦(Huanhuan Zhou)6 小时前
oracle linux8.8一键部署oracle 11g
数据库·oracle
数据库小学妹6 小时前
企业级数据库迁移实践:从Oracle到国产数据库的兼容性与实施策略
数据库·mysql·oracle·dba
六月雨滴6 小时前
Oracle 安全架构概述
数据库·oracle·dba·安全架构
迷藏4946 小时前
【无标题】
java·数据库·oracle
Irene19917 小时前
SQL示例:明辨窗口函数和聚合函数的使用和选择
mysql·oracle