(课堂笔记)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 是系统虚拟表,用于测试函数或常量查询。

相关推荐
ClouGence4 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
ClouGence10 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
曹牧10 天前
Oracle EXPLAIN PLAN
数据库·oracle
贤时间11 天前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心11 天前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
Curvatureflight11 天前
MySQL 深分页越来越慢?从 LIMIT OFFSET 改成游标分页
数据库·oracle
XZ-07000111 天前
MySQL事务
数据库·mysql·oracle
tiancaijiben11 天前
阿里云函数计算FC如何实现网站的定时任务与自动化
数据库·oracle·dba
xfhuangfu11 天前
Oracle 19c 多租户体系架构介绍
数据库·oracle·架构
杨云龙UP11 天前
Spotlight 接入 Oracle 数据库监控操作指南 2026-06-16
数据库·oracle·性能监控·预警·阈值·spotlight·瓶颈分析