zoukankan      html  css  js  c++  java
  • 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码转换为字符:

    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;

    4.3..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;

    4.4.CAST()函数可以进行数据类型的转换。

    转换列或值

    语法:cast( 列名/值 as 数据类型 )

    ELECT CAST(FACT_NO AS CHAR(6)),FACT_ODR_NO
    FROM ODRM
    WHERE FACT_ODR_NO = CAST('A6707003M' AS CHAR(20));

    SELECT CAST('123.447654' AS decimal(5,2)) as result from dual;

    5.其他单行函数

     5.1.NVL(x,value)

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

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

    5.2.NVL2(x,value1,value2)

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

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

    6.聚合函数

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

    名称 作用 语法
    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;

  • 相关阅读:
    Log4net 在framework Client中编译失败
    (MVC)从客户端中检测到有潜在危险的 Request.Form 值
    RichText设置高亮 (未完)
    1转换为00001等
    简单的MDX案例及说明(3)
    兼容型Word 并带传统读法
    Visual Studio 2010添加新项缺失[ADO.NET 实体数据模型]解决方法
    SQL Server 的优化方法(续转)
    两个有用的委托:Func和Action
    SQL Server 的优化方法(转)
  • 原文地址:https://www.cnblogs.com/scwbky/p/9697945.html
Copyright © 2011-2022 走看看