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

相关推荐
cyber_两只龙宝2 小时前
【Oracle】Oracle数据库的登录验证
linux·运维·数据库·sql·云原生·oracle
杨云龙UP13 小时前
ODA登录ODA Web管理界面时提示Password Expired的处理方法_20260423
linux·运维·服务器·数据库·oracle
尚雷558018 小时前
从电商订单支付更新,吃透 Oracle 数据修改的底层设计哲学与全组件协同原理
数据库·oracle
李兆龙的博客18 小时前
从一到无穷大 #70 从 LR 图 PEC 到InfluxQL兼容性差分测试方法论与工程实践
数据库·功能测试·oracle
张子行的博客20 小时前
SQL 调优实战:跨表排序性能提升之路
数据库·sql·oracle
FinTech老王21 小时前
逻辑删除不等于物理销毁:KingbaseES敏感数据标记与销毁实操指南
数据库·安全·oracle
池佳齐1 天前
软考高级系统架构设计师备考(十八):数据库系统—事务管理与并发控制
数据库·oracle·系统架构
Irene19911 天前
数据库“水位线”概念详解:Oracle数据库的数据文件空间管理 和 Flink/流处理中的事件时间处理
数据库·oracle
Irene19911 天前
(课堂笔记)Oracle 子查询与表操作
数据库·oracle