Oracle常用函数介绍

Oracle常用函数介绍

Oracle SQL提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能。函数可以接受零个或者多个输入参数,并返回一个输出结果。Oracle数据库中主要使用两种类型的函数:

单行函数:对每一个函数应用在表的记录中时,只能输入一行结果,返回一个结果,比如:MOD(x,y)返回x除以y的余数(x和y可以是两个整数,也可以是表中的整数列)。

常用的单行函数有:
  字符函数:对字符串操作。
  数字函数:对数字进行计算,返回一个数字。
  转换函数:可以将一种数据类型转换为另外一种数据类型。
  日期函数:对日期和时间进行处理。

常用的单多函数有:
聚合函数:聚合函数同时可以对多行数据进行操作,并返回一个结果。比如SUM(x)返回结果集中x列的总合。

1.字符函数:

字符函数接受字符参数,这些参数可以是表中的列,也可以是一个字符串表达式。下表列出了常用的字符函数。

函数 说明

ASCII(X) 返回字符X的ASCII码。
select ASCII('A') from DUAL 65

chr()函数将ASCII码转换为字符:

扫描二维码关注公众号,回复: 3359388 查看本文章

select chr(65) from dual;  A

在oracle中chr()函数和ascii()是一对反函数。


CONCAT(X,Y) 连接字符串X和Y。
select CONCAT('Hello', ' world') from DUAL HELLO WORLD


INSTR(X, STR. start, N) 在X中查找STR,可以指定从START开始,也可以指定从第N次开始。
select INSTR('Hello world','or') from DUAL 8


length(X) 返回X的长度。
select length('Hello') from DUAL 5


LOWER(X) X转换为小写。
select LOWER('hElLO') from DUAL; hello


UPPER(X) X转换为大写。
SELECT UPPER('hello') FROM DUAL HELLO


ltrim(x,trim_str) 把x的左边截去trim_str字符串,缺省截去空格。
select ltrim('===HELLO===', '=') from dual hello===


rtrim(x,trim_str) 把x的右边截去trim_str字符串,缺省截去空格。
select rtrim('===HELLO===', '=') from dual ===hello


trim(trim_str from x) 把x的两边截去trim_str字符串,缺省截去空格。
select '='||trim(' HELLO ')||'=' from dual =hello=


replace(x,old,new) 在x中查找old,并替换为new。
select replace('ABCDE','CD','AAA') from dual abaaae


SUBSTR(x, start ,length) 返回x的字串,从start处开始,截取length个字符,缺省length,默认到结尾。
select substr('ABCDE',2) from dual bcde

select substr('ABCDE',2,3) from dual bcd

2.数字函数

 数字函数接受数字参数,参数可以来自表中的一列,也可以是一个数字表达式。

函数 说明 示例
abs(x) x绝对值 abs(-3)=3

acos(x) x的反余弦 acos(1)=0

cos(x) 余弦 cos(1)=1.57079633

ceil(x) 大于或等于x的最小整数 ceil(5.4)=6

floor(x) 小于或等于x的最大整数 floor(5.8)=5

log(x,y) x为底y的对数 log(2,4)=2

mod(x,y) x除以y的余数 mod(8,3)=2

power(x,y) x的y次幂 power(2,3)=8

round(x,y) x在第y小数位四舍五入 round(3.456,2)=3.46
在缺省y时,默认y=0;比如:ROUND(3.56)=4。
y是正整数,就是四舍五入到小数点后y位。ROUND(5.654,2)=5.65。
y是负整数,四舍五入到小数点左边|y|位。round(351.654,-2)=400。

sqrt(x) x的平方根 sqrt(4)=2

trunc(x,y) x在第y位截断 trunc(3.456,2)=3.45
在缺省y时,默认y=0;比如:TRUNC (3.56)=3。
y是正整数,就是四舍五入到小数点后y位。TRUNC (5.654,2)=5.65。
y是负整数,四舍五入到小数点左边|y|位。TRUNC (351.654,-2)=300。

3.日期函数

日期函数对日期进行运算。常用的日期函数有:

 3.1.ADD_MONTHS(d,n),在某一个日期d上,加上指定的月数n,返回计算后的新日期。d表示日期,n表示要加的月数

可以得到某一时间之前或之后n个月的时间; 查询当前时间2个月以前的时间

select add_months(sysdate,-2) from dual;

 查询当前时间2个月以后的时间

select add_months(sysdate,2) from dual;

 3.2.LAST_DAY(d),返回指定日期当月的最后一天。

select LAST_DAY(sysdate) from dual;

获取当前日期所在月的第一天和最后一天:

select trunc(sysdate,'month') first_day,last_day(trunc(sysdate,'month')) last_day from dual;

 3.3.round

ROUND(d[,fmt]),返回一个以fmt为格式的四舍五入日期值,d是日期,fmt是格式模型。默认fmt为DDD,即月中的某一天。
如果fmt为“YEAR”则舍入到某年的1月1日,即前半年舍去,后半年作为下一年。
如果fmt为“MONTH”则舍入到某月的1日,即前月舍去,后半月作为下一月。
默认为“ddd”,即月中的某一天,最靠近的天,前半天舍去,后半天作为第二天。
如果fmt为“day”则舍入到最近的周的周日,即上半周舍去,下半周作为下一周周日
;
select ROUND(sysdate),round(sysdate,'year'),round(sysdate,'month'),round(sysdate,'day') from dual;

 3.4.trunc

与round对应的函数时trunc(d[,fmt])对日期的操作,trunc与round非常相似,只是不对日期进行舍入,直接截取到对应格式的第一天。
select trunc(sysdate),trunc(sysdate,'year'),trunc(sysdate,'month'),trunc(sysdate,'day') from dual;

 3.5.EXTRACT(fmt FROM d),提取日期中的特定部分。

fmt为:year、month、day、hour、minute、second。其中year、month、day可以为date类型匹配,也可以与timestamp类型匹配;但是hour、minute、second必须与timestamp类型匹配。

;只可以从一个date类型中截取年月日
select extract (year from sysdate) year, extract (month from sysdate) month, extract (day from sysdate) day from dual;
select extract (year from date '2015-05-04') year, extract (month from date'2015-05-04') month, extract (day from date '2011-05-04') day from dual;

select extract( year from to_date( '20180801','yyyy-mm-dd')) year,
extract(month from to_date('20180801','yyyy-mm-dd')) month,
extract(day from to_date('20180801','yyyy-mm-dd')) day
from dual;

可以从一个timestamp类型中截取年月日时分秒
select
extract(year from systimestamp) year
,extract(month from systimestamp) month
,extract(day from systimestamp) day
,extract(minute from systimestamp) minute
,extract(second from systimestamp) second
,extract(timezone_hour from systimestamp) th
,extract(timezone_minute from systimestamp) tm
,extract(timezone_region from systimestamp) tr
,extract(timezone_abbr from systimestamp) ta
from dual

获取两个日期之间的具体时间间隔,extract函数是最好的选择

select
extract (day from dt2 - dt1) day,
extract (hour from dt2 - dt1) hour,
extract (minute from dt2 - dt1) minute,
extract (second from dt2 - dt1) second
from
(
select
to_timestamp ('2011-02-04 15:07:00','yyyy-mm-dd hh24:mi:ss') dt1,
to_timestamp ('2011-05-17 19:08:46','yyyy-mm-dd hh24:mi:ss') dt2
from
dual
);

获取interval 类型特点部分
select extract(day from interval '4 5:12:10.222' day to second(3)) year from dual
eading_precision值的范围是0到9, 默认是2. time_expr的格式为:hh[:mi[:ss[.n]]] or mi[:ss[.n]] or ss[.n], n表示微秒.
范围值:

hour: 0 to 23

minute: 0 to 59

second: 0 to 59.999999999

eg:

interval '4 5:12:10.222' day to second(3) 表示: 4天5小时12分10.222秒

interval '4 5:12' day to minute 表示: 4天5小时12分

interval '400 5' day(3) to hour 表示: 400天5小时, 400为3为精度,所以"day(3)", 注意默认值为2.

interval '400' day(3) 表示: 400天

interval '11:12:10.2222222' hour to second(7) 表示: 11小时12分10.2222222秒

interval '11:20' hour to minute 表示: 11小时20分

interval '10' hour 表示: 10小时

interval '10:22' minute to second 表示: 10分22秒

interval '10' minute 表示: 10分

interval '4' day 表示: 4天

interval '25' hour 表示: 25小时

interval '40' minute 表示: 40分

interval '120' hour(3) 表示: 120小时

interval '30.12345' second(2,4) 表示: 30.1235秒, 因为该地方秒的后面精度设置为4, 要进行四舍五入.

interval '20' day - interval '240' hour = interval '10-0' day to second 表示: 20天 - 240小时 = 10天0秒

4.转换函数

 4.1TO_CHAR

转换函数将值从一种数据类型转换为另外一种数据类型。常用的转换函数有:
TO_CHAR(d|n[,fmt])
把日期和数字转换为制定格式的字符串。fmt是格式化字符串,日期的格式化字符串前面已经学习过。
代码演示:TO_CHAR对日期的处理

SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') "date"
FROM DUAL;

to_char(timestamp, text) text 把 timestamp 转换成 string to_char(systimestamp,'HH12:MI:SS')
select to_char(systimestamp,'HH12:MI:SS') from dual;
to_char(int, text) text 把 int4/int8 转换成 string to_char(125, '999')
select to_char(125, '999') from dual;
to_char(float, text) text 把 float4/float8 转换成 string to_char(125.8, '999D9')
select to_char(125.8, '999D9') from dual;
to_char(numeric, text) text 把 numeric 转换成 string to_char(numeric '-125.8', '999D99S')
select to_char( -125.8, '999D99S') from dual;

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual; //日期转化为字符串
select to_char(sysdate,'yyyy') as nowYear from dual; //获取时间的年
select to_char(sysdate,'mm') as nowMonth from dual; //获取时间的月
select to_char(sysdate,'dd') as nowDay from dual; //获取时间的日
select to_char(sysdate,'hh24') as nowHour from dual; //获取时间的时
select TO_CHAR(sysdate,'mi') as NOWMINUTE from DUAL; //获取时间的分
select to_char(sysdate,'ss') as nowSecond from dual; //获取时间的秒

字符串和时间互转

代码如下:

select TO_CHAR( TO_DATE(268,'J'),'Jsp') from DUAL ;//显示Two Hundred Sixty-Eight

求某天是星期几

代码如下:

select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day') from dual; //星期一
select to_char(to_date('2002-08-26','yyyy-mm-dd'),'day',
'NLS_DATE_LANGUAGE = American') from dual; // monday
//设置日期语言
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
//也可以这样
TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') 

4.2.TO_DATE(x [,fmt])

select TO_DATE('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss') from DUAL;

select TO_DATE ('2002-08-26', 'YYYY-mm-dd', 'NLS_DATE_LANGUAGE = American') from dual;

4.2.1两个日期间的天数

代码如下:

select floor(sysdate - to_date('20020405','yyyymmdd')) from dual;
 

4.2.2时间为null的用法

代码如下:

select id, active_date from table1
union
select 1, TO_DATE(null) from dual; //注意要用TO_DATE(null)

4.2.3.

月份差

代码如下:

a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd')
//那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。
//所以,当时间需要精确的时候,觉得TO_CHAR还是必要的
;
select * from ODRM
where to_date(rev_odr_date,'yyyymmdd') between to_date('20011201','yyyymmdd') and to_date('20181231','yyyymmdd')

4.2.4.

日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01'

代码如下:

alter system set nls_date_language = AMERICAN ;
alter session set NLS_DATE_LANGUAGE = American ;
//或者在to_date中写
select to_char(to_date('2002-08-26','yyyy-mm-dd'),
'day','NLS_DATE_LANGUAGE = American') from dual;
//注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多,可查看
select * from NLS_SESSION_PARAMETERS ;
select * from V$NLS_PARAMETERS ;

4.2.5.

查找月份

代码如下:

select months_between(to_date('01-31-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
//结果为:1
select months_between(to_date('02-01-1999','MM-DD-YYYY'),
to_date('12-31-1998','MM-DD-YYYY')) "MONTHS" FROM DUAL;
//结果为:1.03225806451613

4.2.6.

Next_day的用法

代码如下:

NEXT_DAY(DATE,WEEKDAY) 即 NEXT_DAY(日期,星期几)
select NEXT_DAY(sysdate,'星期日') from DUAL;
select NEXT_DAY(TO_DATE('2014-4-1','yyyy-MM-dd'),'星期三') from DUAL;

5..TO_NUMBER(x[,fmt])

TO_NUMBER函数()是Oracle中常用的类型转换函数之一,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作用正好相反。

To_number函数的格式如下:

To_number(varchar2 or char,’format model’)1

To_number函数中也有很多预定义的固定格式:

格式值 含义
9 代表一个数字
0 强迫0显示
$ 显示美元符号
L 强制显示一个当地的货币符号
. 显示一个小数点
, 显示一个千位分隔符号

select TO_NUMBER('234234.4350','999999.0000') from DUAL;

 select to_number('$123,233,455,623.3400','$999,999,999,999.0000') from dual;

將非数字的字符替换为空字符
select TO_NUMBER(REGEXP_REPLACE('2018-+','[^0-9]','')) from dual;

6.其他单行函数

 6.1.NVL(x,value)

如果x为空,返回value,否则返回x。

select nvl(exgo_mk,'N')  from odrm;

6.2.NVL2(x,value1,value2)

如果x非空,返回value1,否则返回value2。

select nvl2(exgo_mk,'Y','N') from odrm;

7.聚合函数

聚合函数同时对一组数据进行操作,返回一行结果,比如计算一组数据的总和,平均值等。

名称 作用 语法
AVG 平均值 AVG(表达式)
SUM 求和 SUM(表达式)
MIN、MAX 最小值、最大值
min(表达式)、MAX(表达式)
COUNT 数据统计COUNT(表达式)

select avg(odr_qty),count(*),sum(odr_qty),min(odr_qty),max(odr_qty) from odrm;

猜你喜欢

转载自www.cnblogs.com/scwbky/p/9697945.html