暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle的常用函数

全栈精英 2021-08-10
356

字符串函数

     -- 返回字符a的ASCII码
    SELECT ASCII('a') FROM dual; -- 97
    -- 连接字符串hello和world
    SELECT CONCAT('Hello','world') FROM dual; -- Helloworld
    -- 从Hello中查找or
    SELECT INSTR('Hello world','or') FROM dual; -- 8
    -- 返回Hello的长度
    SELECT LENGTH('Hello') FROM dual; -- 5
    -- Hello转换成小写
    SELECT LOWER('Hello') FROM dual; -- hello
    -- hello转换成大写
    SELECT UPPER('hello') FROM dual; -- HELLO
    -- 把=Hello=的左边截去=字符串,缺省截去空格
    SELECT LTRIM('=Hello=','=') FROM dual; -- Hello=
    -- 把=Hello=的右边截去=字符串,缺省截去空格
    SELECT RTRIM('=Hello=','=') FROM dual; -- =Hello
    -- 把=Hello=的两边截去=字符串,缺省截去空格
    SELECT TRIM('='FROM'=Hello=') FROM dual; -- Hello
    -- 在ABCDE中查找CD,并替换成AAA
    SELECT REPLACE('ABCDE','CD','AAA')FROM dual; -- ABAAAE
    -- 返回ABCDE的字符串,从第2个位置开始,截取3个字符
    SELECT SUBSTR('ABCDE',2,3) FROM dual; -- BCD

    数字函数

       -- -3的绝对值
      SELECT ABS(-3) FROM dual; -- 3
      -- X的反余弦
      SELECT ACOS(1) FROM dual; -- 0
      -- 余弦
      SELECT COS(1) FROM dual; -- 0.54030230586814
      -- 大于或等于5.4的最小值(向上取整)
      SELECT CEIL(5.4) FROM dual; -- 6
      -- 小于或等于5.8的最大值(向下取整)
      SELECT FLOOR(5.8) FROM dual; -- 5
      -- 2为底4的对数
      SELECT LOG(2, 4) FROM dual; -- 2
      -- 8除以3的余数
      SELECT MOD(8, 3) FROM dual; -- 2
      -- 2的3次幂
      SELECT POWER(23) FROM dual; -- 8
      -- 3.456在第2位,四舍五入
      SELECT ROUND(3.456, 2) FROM dual; -- 3.46
      -- 4的平方根
      SELECT SQRT(4) FROM dual; -- 2
      -- 3.456在第2位截断,不四舍五入
      SELECT TRUNC(3.4562) FROM dual; -- 3.45

      日期函数 

        -- ADD_MONTHS(d,n),在某一个日期 d 上,加上指定的月数 n,返回计算后的新日期。d 表示日期,n 表示要加的月数
        SELECT SYSDATE 今日, add_months(SYSDATE,5) 五个月后 FROM dual;

        -- LAST_DAY(d),返回指定日期当月的最后一天
        SELECT SYSDATE 今日, last_day(SYSDATE) 本月最后一天 FROM dual;

        -- ROUND(d[,fmt]),返回一个以 fmt 为格式的四舍五入日期值, d 是日期, fmt 是日期格式代号。
        -- 默认为 DDD,即月中的某一天。最靠近的天,前半天舍去,后半天作为第二天。
        -- fmt 为“YEAR”则舍入到某年的 1 月 1 日,即前半年舍去,后半年作为下一年。
        -- fmt 为“MONTH”则舍入到某月的 1 日,即前月舍去,后半月作为下一月。
        -- fmt 为“DAY”则舍入到最近的周的周日,即上半周舍去,下半周作为下一周周日。
        SELECT SYSDATE 今日,
        ROUND(SYSDATE) 最近一天,
        ROUND(SYSDATE,'day') 最近周日,
        ROUND(SYSDATE,'month') 最近一月,
        ROUND(SYSDATE,'year') 最近一年
        FROM dual;
        -- 注意:TRUNC 与 ROUND 非常相似,只是不对日期四舍舍入,直接截取到对应格式的第一天

        -- EXTRACT(fmt FROM d),提取日期中的特定部分。
        -- fmt 为:YEAR、MONTH、DAY、HOUR、MINUTE、SECOND
        -- 其中 YEAR、MONTH、DAY可以为 DATE 类型匹配,也可以与 TIMESTAMP 类型匹配;但是 HOUR、MINUTE、SECOND 必须与 TIMESTAMP 类型匹配。
        -- HOUR 匹配的结果中没有加上时区,因此在中国运行的结果小 8 小时
        SELECT SYSDATE 今日,
        EXTRACT(YEAR FROM SYSDATE) 年,
        EXTRACT(MONTH FROM SYSDATE) 月,
        EXTRACT(DAY FROM SYSDATE) 日,
        EXTRACT(HOUR FROM SYSTIMESTAMP) 时,
        EXTRACT(MINUTE FROM SYSTIMESTAMP) 分,
        EXTRACT(SECOND FROM SYSTIMESTAMP) 秒
        FROM dual;

        转换函数

           -- TO_CHAR(d|n[,fmt]) 把日期和数字转换为制定格式的字符串
          -- fmt是格式化字符串
          SELECT TO_CHAR(SYSDATE,'YYYY"年"MM"月"DD"日" HH24:MI:SS') 今日今时 FROM dual;

          -- TO_DATE(X,[,fmt]) 把一个字符串以fmt格式转换成一个日期类型

          -- TO_NUMBER(X,[,fmt]) 把一个字符串以fmt格式转换为一个数字
          SELECT TO_NUMBER('-$12,345.67','$99,999.99') 格式化 FROM dual;

          单行函数

             -- NVL(X,VALUE) 如果X为空,返回value,否则返回X
            -- 对工资是2000元以下的员工,如果没发奖金,每人奖金100元
            SELECT ENAME 员工, NVL(COMM,100) 奖金 FROM EMP WHERE SAL<2000;

            -- NVL2(x,value1,value2) 如果x非空,返回value1,否则返回value2
            -- 对EMP表中工资为2000元以下的员工,如果没有奖金,则奖金为200元,如果有奖金,则在原来的奖金基础上加100元
            SELECT ENAME, NVL2(COMM,comm+100,200) 奖金 FROM EMP WHERE SAL<2000;



            文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论