当前位置: 首页 > news >正文

Oracle常用函数

目录

一、数学函数

1.ABS(X)取绝对值

2.ROUND(X,Y) 四舍五入

3.TRUNC(X,Y)截断

4.FLOOR向下取整(<)

5.CEIL向上取整(>)

6.MOD取余数与MOD(X,Y) x除以y的余数

7.TRUNC取商(相当于取整)

8.POWER取幂

二、日期函数

1.日期 + 整数 得到的是 日期

2.日期 - 日期 得到的是 数字 单位是 天

3.TRUNC 也可以对日期做截断

4.使用TO_CHAR判断日期  

5.月份加减ADD_MONTHS(时间,数字)

6.LAST_DAY(时间),返回指定日期 当月 的最后一天

7.MONTHS_BETWEEN(大的日期,小的日期)

三、字符串函数

1.两两拼接CONCAT(参数1,参数2)

2.管道拼接符  ||

3.wm_concat(x)+GROUP BY

4.字符串长度LENGTH(参数)

5.字节长度LENGTHB(参数)  

6.转换为大写UPPER()

7.转换为小写LOWER()

8.ASCII(x)返回字符x的ASCII码

9.CHR(ASCII编码)返回的是第一个字母对应的  ASCII 编码

10.左填充  LPAD   left pad

11.右填充  RPAD  right pad

12.字符串去除空格

13.匹配截取LTRIM(字符串,字符集)

14.查找字符串位置INSTR

15.截取字符串SUBSTR

16.替换REPLACE(字符串,旧的值,新的值)


一、数学函数

1.ABS(X)取绝对值

SELECT ABS(-1) a
FROM dual;

2.ROUND(X,Y) 四舍五入

--保留y位小数

SELECT trunc(31.1456, -2) a1, ROUND(3.124) a2
FROM dual;

3.TRUNC(X,Y)截断

--在 X 的第 Y 位截断

--截断的意思就是:从截断的那个位置开始,后面的所有数据都变成 0

--如果第二个参数是正数,那么就是从小数点之后截断,如果是负数,那么就是从小数点之前截断

SELECT TRUNC(3567.1263, 2) a1, TRUNC(3567.1243, -2) a2, TRUNC(3567.1243) a3
FROM dual;

4.FLOOR向下取整(<)

SELECT FLOOR(56.34)  a1 --56, FLOOR(-56.34) a2 -- -57
FROM dual;

5.CEIL向上取整(>)

SELECT CEIL(56.34) a1, -- 57CEIL(-56.34) a2 -- -56
FROM dual;

6.MOD取余数与MOD(X,Y) x除以y的余数

SELECT MOD(4, 2) a1, -- 0MOD(5, 3) a2 -- 2
FROM dual;

7.TRUNC取商(相当于取整)

SELECT TRUNC(5 / 3) a1 FROM dual;

8.POWER取幂

SELECT POWER(2, 1) a1, POWER(2, -1) a2, POWER(2, 1 / 2) a3
FROM dual;

二、日期函数

SELECT TO_DATE('20220610133050', 'YYYYMMDDHH24MISS') a,TO_DATE('20220610123050', 'YYYYMMDDHHMISS') b
FROM DUAL;

1.日期 + 整数 得到的是 日期

示例:获取明天的日期

SELECT SYSDATE+1 FROM dual;

示例:当前时间往前推1小时

SELECT SYSDATE-1/24 FROM dual;

日期相减计算:

SELECT TO_DATE('20220610', 'YYYYMMDD') - TO_DATE('20220710', 'YYYYMMDD')
FROM DUAL; -- 30

2.日期 - 日期 得到的是 数字 单位是 天

示例:获取2024年天数

SELECT to_date('20241231', 'yyyymmdd') -to_date('20240101', 'yyyymmdd') + 1 a
FROM dual;

3.TRUNC 也可以对日期做截断

示例:截取当年第一天

SELECT TRUNC(SYSDATE, 'yyyy') FROM dual; -- 2025-01-01

示例:截取当月第一天

下面两种方式都可以

SELECT TRUNC(SYSDATE, 'MM') FROM dual;SELECT TO_DATE('202407', 'YYYYMM') FROM DUAL;

示例:获取当前的年月日

下面两种方式都可以

SELECT TRUNC(SYSDATE, 'DD') FROM dual;SELECT TRUNC(SYSDATE) FROM dual;

示例:截取当月第一天

SELECT TRUNC(SYSDATE, 'MM') FROM dual;

示例:截断到小时

SELECT TRUNC(SYSDATE, 'hh') FROM dual;

 

示例:截断到分

SELECT TRUNC(SYSDATE, 'mi') FROM dual;

示例:当前所在星期的第一天

SELECT TRUNC(SYSDATE, 'd') FROM dual;

示例:返回当前时间所在季度的第一天  -- QUARTER

SELECT TRUNC(SYSDATE, 'Q') FROM dual;

4.使用TO_CHAR判断日期  

SELECT TO_CHAR(SYSDATE, 'YYYYMMDD')   a1, TO_CHAR(SYSDATE, 'YYYY-MM-DD') a2, TO_CHAR(SYSDATE, 'YYYY')       第几年, TO_CHAR(SYSDATE, 'MM')         本年第几月, TO_CHAR(SYSDATE, 'DD')         本月第几天, TO_CHAR(SYSDATE, 'Q')          第几个季度, TO_CHAR(SYSDATE, 'W')          本月第几周 --MONTH OF WEEK, TO_CHAR(SYSDATE, 'D')          本周第几天 -- DAY OF WEEK, TO_CHAR(SYSDATE, 'WW')         本年第几周 --YEAR OF WEEK
FROM DUAL;

5.月份加减ADD_MONTHS(时间,数字)

示例:返回上个月的当天

select trunc(add_months(sysdate, -1), 'DD') from dual;

示例:往前推10年

select add_months(trunc(sysdate), -120) from dual;

示例:获取今年5月最后一天

select trunc(add_months(sysdate, 1), 'MM') - 1 from dual;SELECT LAST_DAY(TO_DATE('2025-05', 'YYYY-MM')) AS last_day
FROM DUAL;-- 提取当前年份 EXTRACT(YEAR FROM SYSDATE)
SELECT LAST_DAY(TO_DATE(EXTRACT(YEAR FROM SYSDATE) || '-05', 'YYYY-MM')) AS last_day_of_may
FROM DUAL;

6.LAST_DAY(时间),返回指定日期 当月 的最后一天

示例:获取当月最后一天

select last_Day(trunc(sysdate)) from dual;

示例:获取下个月第一天

select trunc(add_months(sysdate, 1), 'MM') from dual;select last_day(trunc(sysdate, 'MM')) + 1 from dual;SELECT last_day(TRUNC(SYSDATE)) + 1 a FROM dual;SELECT TRUNC(SYSDATE, 'mm') a1, add_months(TRUNC(SYSDATE, 'mm'), 1) a2
FROM dual;

7.MONTHS_BETWEEN(大的日期,小的日期)

得到的结果是个数字, 可以是负数

示例:计算今年过去几个月,取整数

select months_between(trunc(sysdate), trunc(sysdate, 'yyyy')) a,ceil(months_between(trunc(sysdate), trunc(sysdate, 'yyyy'))) b, -- 向上取整trunc(months_between(trunc(sysdate), trunc(sysdate, 'yyyy'))) c -- 截取整数from dual;

1 查询每个员工的工号,入职日期,入职日期是入职年份的第几季度,入职日期所在季度的第一天是哪那一天

select empno,hiredate,to_char(hiredate, 'Q') 入职季度,trunc(hiredate, 'Q') 入职季度第一天from emp;

2.查出 2022年3月2号所在季度的第一天

select trunc(to_date('20220302', 'YYYYMMDD'), 'Q') a from dual;

3.查出 2022年3月2号所在月的最后一天

select last_Day(to_date('20220302', 'YYYYMMDD')) a from dual;select add_months(trunc(to_date('20220302', 'YYYYMMDD'),'MM'), 1) - 1 a from dual;

4.查出2022年3月2号是所在年份的第几个季度

select to_char(to_date('20220302', 'YYYYMMDD'), 'YYYY') 所在年份,to_char(to_date('20220302', 'YYYYMMDD'), 'Q') 所在季度from dual;

5.由2022年3月2号得到 2023年的1月1号

-- 第二年所在季度的第一天
select trunc(add_months(to_date('20220302', 'YYYYMMDD'), 12), 'Q') afrom dual;

6.输出 EMP表中 入职时间 的 上个季度 的 第一天的 月末

select hiredate,to_char(hiredate, 'Q') 入职季度,TRUNC(hiredate, 'Q') 入职季度第一天,ADD_MONTHS(TRUNC(hiredate, 'Q'), -3) 上个季度第一天,last_day(ADD_MONTHS(TRUNC(hiredate, 'Q'), -3)) 上个季度的第一天的月末from emp;

7.计算当前日期跟 2020-01-01 相差多少个月

select ceil(months_between(trunc(sysdate),to_date('2020-01-01', 'YYYY-MM-DD'))) 相差月份from dual; -- 65

三、字符串函数

1.两两拼接CONCAT(参数1,参数2)

select ename,empno,concat(concat(ename, job), sal) a,ename || empno || salfrom emp;

2.管道拼接符  ||

SELECT ename || '-' || empno || '-' || job a, 1 || 2 || 3 b FROM emp;

3.wm_concat(x)+GROUP BY

wm_concat(x)跟 GROUP BY 一起使用,将那一组的多行的某个字段的数据拼在一行里

SELECT DEPTNO, wm_concat(job) a FROM emp GROUP BY DEPTNO;

 

SELECT deptno, wm_concat(DISTINCT job) a FROM emp GROUP BY deptno;

 

每个部门有多少不同的工作种类

select count(job), count(distinct job) from emp group by deptno;

4.字符串长度LENGTH(参数)

SELECT LENGTH('ABC') AS char_count, -- 返回 3(3个字符)LENGTH('你好') AS char_count,    -- 返回 2(2个字符)  LENGTH('A😊B') AS char_count   -- 返回 3(1个字母 + 1个表情符号 + 1个字母)    
FROM DUAL;

5.字节长度LENGTHB(参数)  

SELECT LENGTHB('ABC') AS byte_count,     -- 返回 3(每个字符占1字节)LENGTHB('你好') AS byte_count,     -- 返回 6(每个中文占3字节)LENGTHB('A😊B') AS byte_count     -- 返回 8(表情符号在UTF-8中占4字节)
FROM DUAL;

6.转换为大写UPPER()

select upper('hello') from dual;

7.转换为小写LOWER()

select lower('HELLO') from dual;

8.ASCII(x)返回字符x的ASCII码

select ASCII('a') a, -- 97ASCII('Aa') b, -- 65ASCII(',') c, -- 44ASCII('好') d, -- 47811ASCII('''') a, -- 单引号的ASCII码值是39ASCII(6) -- 54from dual;-- 查询单引号
SELECT '''' a FROM dual;

9.CHR(ASCII编码)返回的是第一个字母对应的  ASCII 编码

通过 ASCII 编码返回对应的字符

SELECT CHR(97) a1, CHR(50403) || CHR(47811) a2 FROM dual;

10.左填充  LPAD   left pad

LPAD(要填充的那个字符串,填充之后的总长度,以什么字符填充)

select lpad('1234', 7, 'a') from dual; -- aaa1234
select lpad('1234', 7, 'ab') from dual; -- aba1234
select lpad('01234', 3, 'ab') from dual; -- 012

11.右填充  RPAD  right pad

SELECT RPAD('1234', 7, 'a') a1, -- 1234aaaRPAD('1234', 7, 'ab') a2, -- 1234abaRPAD('01234', 3, 'ab') a3 -- 012FROM dual;

1.将员工的编号、姓名、工作拼接起来

select empno || ename || job from emp;

2.将每一个岗位的所有员工的名字拼接到一起

select job, wm_concat(ename) from emp group by job;

3.查找名字长度是 4个字符的名字

select ename from emp where length(ename) = 4;

12.字符串去除空格

TRIM (字符串)--去除字符串两边空格

LTRIM(字符串)  ---去除字符串左边空格 LEFT

RTRIM (字符串)---去除字符串右边空格 RIGHT

REPLACE也可以去除字符串内部的空格

SELECT TRIM('  12 3  45  ') a,LTRIM('  12 3  45  ') a2,RTRIM('  12 3  45  ') a3,REPLACE('asdfg   dfhdhf', ' ') a4 -- asdfgdfhdhfFROM dual;

13.匹配截取LTRIM(字符串,字符集)

LTRIM(字符串,字符集) ---从字符串的左边开始与字符集相匹配,匹配的上就消掉,

                     ---直到字符不在字符集里面则停止匹配,并截取

找到一部分也会截取

SELECT LTRIM('asdasfgZXZc', 'as') a1,-- dasfgZXZcLTRIM('asdfgZXZc', 'asg') a2 -- dasfgZXZcFROM dual;

14.查找字符串位置INSTR

INSTR(参数1, 参数2 ,参数3,参数4)   返回的是字符在字符串出现的位置

参数1 在哪个字符串中查找

参数2 查找的是哪一个字符

参数3 从哪一个位置开始找

参数4 第几次出现

--返回的位置是从左边第一个位置开始数的

--第三个参数是正数的时候,就是从左往右找

--第三个参数是负数的时候,就是从右往左找

SELECT INSTR('aasdaf23', 'a', 1, 3) a1, -- 5INSTR('aasdf23', '3') a2, -- 7INSTR('aasdf23', 'a', 4, 1) a3, -- 0INSTR('aasdf23', 'a', -1, 2) a4 -- 1FROM dual;

15.截取字符串SUBSTR

SUBSTR(参数1,参数2,参数3)

注意:截取都是从左往右截取

参数1 从哪个字符串中截

参数2 从这个字符串的哪个位置截取,如果参数2为负数,就是从倒数第几个位置开始截取

参数3 截取的长度,如果参数3 为空,就默认截到末尾

SELECT SUBSTR('1234567', 1, 1) a1, -- 1SUBSTR('1234567', 1, 4) a2, -- 1234SUBSTR('1234567', -1, 1) a3, -- 7SUBSTR('12345678', -2, 4) a4, -- 78SUBSTR('1234567', -3, 4) a5, -- 567SUBSTR('1234567', -3) a6 -- 567FROM dual;

16.替换REPLACE(字符串,旧的值,新的值)

SELECT REPLACE('asdfgdh', 'd', 'x') a, -- asxfgxhREPLACE('asdfgdh', 'd', 'x1') a, -- asx1fgx1hREPLACE('asdfgdfhdhf', 'df', 'x') a, -- asxgxhdhfREPLACE('asdfg   dfhdhf', ' ') a -- asdfgdfhdhfFROM dual;

练习:

1.在 EMP中找出名字的首字母是 A 的员工的名字

select ENAME from emp where substr(ename, 1, 1) = 'A';
SELECT ename FROM EMP WHERE INSTR(ename, 'A') = 1;

2.在 EMP 表中找出名字的最后一个字符是 S 的员工的名字

select ENAME from emp where substr(ename, -1, 1) = 'S';
SELECT ename FROM EMP WHERE SUBSTR(ename, LENGTH(ename), 1) = 'S';

3.保证EMP表的员工姓名是6位长度,如果不够左边填充X

select lpad(ename, 6, 'X') from emp;

4.将 '2020-1-3'转换成'2020-01-03'

select to_date('2020-1-3', 'YYYY-MM-DD') A,TO_CHAR(to_date('2020-1-3', 'YYYY-MM-DD'), 'YYYY-MM-DD') Bfrom dual;
select replace('2020-1-3','-','-0') from dual;

相关文章:

  • LVS 负载均衡集群应用实战
  • 数据库系统概论(九)SQL连接查询语言超详细讲解(附带例题,表格详细讲解对比带你一步步掌握)
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(28):ばかり
  • SQL 的 DECODE 函数
  • MacOS Docker 启动 RustDesk Server OSS
  • 多版本Node.js共存管理工具NVM详细使用教程
  • postgresql 常用参数配置
  • 第七部分:第二节 - 在 Node.js 中连接和操作 MySQL:厨房与仓库的沟通渠道
  • Postgresql 数据库体系架构
  • 从逆流监测到智慧用电:ADL200N-CT系列单相导轨表赋能家庭绿色能源
  • 储能电站:风光储一体化能源中心数字孪生
  • TiDB迁移实战:解决“Region is unavailable”报错与隐式类型转换引发的索引失效
  • PHP序列化数据格式详解
  • 多模态大语言模型arxiv论文略读(九十)
  • 【Python 基础与实战】从基础语法到项目应用的全流程解析
  • 编程技能:字符串函数10,strchr
  • php 根据另一个数组中 create_time 的时间顺序,对原始数组进行排序。
  • 计算机操作系统(十二)详细讲解调计算机操作系统调度算法与多处理机调度
  • 使用 Elasticsearch 和 Red Hat OpenShift AI 提升工作流程效率
  • 什么是VR场景?VR与3D漫游到底有什么区别
  • 南山做网站多少钱/最新推广赚钱的app
  • 网站建设报告实训步骤/seo专业技术培训
  • 企业宣传网站怎么做/注册城乡规划师好考吗
  • 上海高端网站公司哪家好/百度免费建网站
  • 软件开发模式/seo怎么刷关键词排名
  • 做服装店网站的素材/百度指数官方下载