1. 程式人生 > >十七、Oracle內建函式

十七、Oracle內建函式

                                             Oracle內建函式

1、數值函式

絕對值函式:SELECT  ABS(-100),ABS(-100),ABS('-100')  FROM dual

取餘函式:SELECT  MOD(-100,6),MOD(-100,10),MOD('-100',3)  FROM  dual

正弦函式:SELECT SIN(9),SIN('9') FROM dual

天花板函式:SELECT CEIL(10),CEIL(10.2),CEIL(-10.2) FROM dual

地板函式:SELECT FLOOR(10),FLOOR(10.2),FLOOR(-10.2) FROM dual

平方根函式:SELECT SQRT(10),SQRT(3) FROM DUAL

指數函式:SELECT POWER(2,2),POWER(3,3) FROM dual

對數函式:SELECT LOG(10,100),LOG(10,2) FROM dual

取整函式:SELECT ROUND(100.2435,4),ROUND(100.2345,-2),ROUND(100.2345,2.25) FROM dual

2、字元函式

ASCII碼轉字元函式:SELECT CHR(65) FROM dual

字元轉ASCII碼函式:SELECT ASCII('楊'),ASCII('A') FROM dual

字串長度函式:SELECT LENGTH('字串長度') FROM dual

擷取字串函式:SELECT SUBSTR('擷取字串長度',1,5) FROM dual

連線字串函式:SELECT CONCAT('連線','字串'),'連線'||'字串' FROM dual 

搜尋函式:SELECT INSTR('檢視字串在目標字串中的位置','目標') FROM dual

倒搜尋函式:SELECT INSTR('檢視字串在目標字串中的位置','目標',-1) FROM dual

替換函式:SELECT REPLACE('這是要被替換的,這還是。','是','77')FROM dual

右連線字元函式:SELECT RPAD('連線字元',16,'連到右邊,共八位長度') FROM dual

左連線字元函式:SELECT LPAD('連線字元',16,'連到右邊,共八位長度') FROM dual

左右去空格:SELECT TRIM(' TEST ') FROM dual

去除指定字尾:SELECT TRIM(TRAILING 'T' FROM 'TEST') FROM dual

去除指定字首:SELECT TRIM(LEADING 'T' FROM 'TEST') FROM dual

去除指定前後綴:SELECT TRIM(BOTH 'T' FROM 'TEST') FROM dual

3、日期函式

--系統日期: 
SELECT sysdate FROM DUAL

--系統timestamp: 
SELECT systimestamp FROM DUAL

--資料庫時區: 
SELECT dbtimezone FROM DUAL

--當前時間: 
SELECT CURRENT_DATE FROM DUAL

--SESSIONTIMEZONE函式(當前會話時區): 
SELECT  SESSIONTIMEZONE  FROM DUAL

--to_char函式: 
SELECT to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') FROM DUAL

--ADD_MONTHS函式(為日期加上月): 
SELECT to_char(ADD_MONTHS(TO_DATE('2018-10-12','YYYY-MM-DD'),2),'yyyy-mm-dd hh24:mi:ss') FROM DUAL

--LAST_DAY函式: 
SELECT LAST_DAY(SYSDATE) FROM DUAL

--NEXT_DAY函式(返回指定日期下週的星期幾): 
SELECT SYSDATE,NEXT_DAY(SYSDATE,'星期二') from dual

--EXTRACT函式:
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   


--months_between函式計算兩個日期之間的相差的月數:
select months_between(to_date('2014-3-21','yyyy-mm-dd'), to_date('2014-1-10','yyyy-mm-dd')) ONE,
       months_between(to_date('2014-1-10','yyyy-mm-dd'), to_date('2014-3-21','yyyy-mm-dd')) TWO,
       months_between(to_date('2014-1-10','yyyy-mm-dd'), to_date('2014-1-10','yyyy-mm-dd')) THREE from dual;

--new_time函式:
select to_char(sysdate, 'yyyy.mm.dd hh24:mi:ss') bj_time,
       to_char(new_time(sysdate, 'PDT', 'GMT'), 'yyyy.mm.dd hh24:mi:ss') los_angles
  from dual;


--Trunc函式:四捨五入
SELECT TRUNC(SYSDATE), -- 今天的日期為  2014-05-08
       TRUNC(SYSDATE, 'YYYY'), --返回當年第一天 2014-01-01  yyyy/yy/year 年
       TRUNC(SYSDATE, 'MM'), --返回當月第一天  2014-05-01   mm/month     月
       TRUNC(SYSDATE, 'DD'), --返回當前年月日 2014-05-08    d/day        周
       TRUNC(SYSDATE, 'D'), --(星期天)返回當前星期的第一天 2014-05-04
       TRUNC(SYSDATE, 'HH'), --返回當前時間精確小時  2014-05-08 11:00:00
       TRUNC(SYSDATE, 'MI') -- 返回當前時間精確分鐘  2014-05-08 11:06:00  TRUNC()函式沒有秒的精確  
  FROM DUAL;
  
  
--Round函式:只是
select Round(sysdate, 'Q') Rnd_Q, --2014-04-01
       Round(sysdate, 'Month') Rnd_Month, --2014-05-01
       Round(sysdate, 'WW') Rnd_Week, --2014-05-07
       Round(sysdate, 'W') Rnd_Week_again, --2014-05-08
       Round(sysdate, 'DDD') Rnd_day, --2014-05-08
       Round(sysdate, 'DD') Rnd_day_again, --2014-05-08
       Round(sysdate, 'DAY') Rnd_day_of_week, --2014-05-11
       Round(sysdate, 'D') Rnd_day_of_week_again, --2014-05-11
       Round(sysdate, 'HH12') Rnd_hour_12, --2014-05-08 12:00:00
       Round(sysdate, 'HH24') Rnd_hour_24, --2014-05-08 12:00:00
       Round(sysdate, 'MI') Rnd_minute --2014-05-08 11:52:00
  from dual;

3、字元函式

--字串轉ASCII型別字串函式
SELECT ASCIISTR('測試字串轉ASCII編碼') from dual

--二進位制轉十進位制函式
SELECT BIN_TO_NUM(1),BIN_TO_NUM(1,1),BIN_TO_NUM(1,1,1) FROM DUAL 

--資料型別轉換函式
SELECT CAST('123.4567' AS NUMBER(10,2)),
        CAST(123.4567 AS VARCHAR2(8)),
         CAST(SYSDATE AS VARCHAR2(14))   FROM DUAL;


--CHARTOROWID
SELECT CHARTOROWID('AAAToYAAEAAAALzAAC') FROM DUAL


--ROWIDTOCHAR,返回vchar型別
SELECT ROWIDTOCHAR(ROWID) FROM SYS_DECLARE


--返回vchar2型別
SELECT ROWIDTONCHAR(ROWID) FROM SYS_DECLARE


--字串在字符集間的轉換函式,US7ASCII目標字元型別,WE8ISO8859P1原字元
SELECT CONVERT('測試字串=====','US7ASCII', 'WE8ISO8859P1') FROM DUAL

--to_date函式
select to_date('20170615','yyyy-MM-dd HH24:mi:ss') from dual;//mi是分鐘
select to_date('20170615','yyyy-MM-dd HH24:mm:ss') from dual;//mm會顯示月份


--to_number函式
select to_number('000012134') from dual;
select to_number('88877') from dual; 


--TO_CHAR函式
select TO_CHAR(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual
select TO_CHAR(123,'$99,999.9') from dual;

4、NULL函式

--返回表示式列表中,結果不為null的表示式
SELECT COALESCE(NULL,9-1,NULL) FROM DUAL


--LNNVL函式:排除指定條件的資料(null也排除)
select * from EMP t where LNNVL(t.deptno>10)


--NVL函式值替換:如果comm為null用-1替代
select ename,NVL(comm, -1) from emp;


--NVL2函式:第一個comm為空用-1,不為空用第二個common

select ename,nvl2(comm,comm,-1) from emp;

5、集合函式

--AVG函式:計算指定列值的平均數

--COUNT函式:計算指定列的記錄條數

--MAX、MIN計算指定列中的最大或者最小值