1. 程式人生 > 其它 >Oracle常用數學、日期、字串函式

Oracle常用數學、日期、字串函式

為了日常使用,這裡總結一些常用的oracle函式。

數學函式

函式名 說明
ABS(n) 返回數值 n 的絕對值
CEIL(n) 向上取整
FLOOR(n) 向下取整
MOD(n1, n2) 返回n1除以n2的餘數
POWER(n1, n2) 返回n1的n2次方
SIGN(n) 判斷n,大於0返回1,小於0返回-1,等於0返回0
SQRT(n) 返回n的平方根
ROUND(n) 對n四捨五入
TRUNC(n1, n2) 擷取精度,n1保留n2個小數

例子

select ABS(-5) from dual;	-- 返回 5
select ABS(2.35) from dual;	-- 返回 3
select POWER(2,5) from dual;	-- 返回2的5次方
select TRUNC(3.1415926,2) from dual;	-- 返回3.14

日期函式

介紹一些日常用到的函式

函式 說明
syadate 系統時間
to_date(ch, fmt) 將字串ch,按fmt格式,轉成date型別
to_char(n ...) 是返回字串;(to_char是用法很多)
trunc(date, fmt) 截斷到最接近的日期,單位為天 ,返回的是日期型別
round(date, fmt) 舍入到最接近的日期
next_day(date,ch) 返回下個星期的日期, ch為1-7,代表星期日到星期六
last_day(date) 返回指定日期d所在月份的最後一天

fmt 日期格式

常見代表符號:yyyy 年,mm 月,dd 日,hh 12小時制,24hh 24小時制,mi 分鐘,ss 秒,day 星期

日期函式用於處理date型別的資料,兩個日期相減返回日期之間相差的天數。

1、日期和字串相互轉換

select syadate from dual;	--獲取系統時間
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;   --日期轉化為字串   
select to_char(sysdate,'yyyy') from dual;   --獲取時間的年   
select to_char(sysdate,'mm') from dual;   --獲取時間的月   
select to_char(sysdate,'dd') from dual;   --獲取時間的日   
select to_char(sysdate,'hh24') from dual;   --獲取時間的時   
select to_char(sysdate,'mi') from dual;   --獲取時間的分   
select to_char(sysdate,'ss')  from dual;  --獲取時間的秒
-- 返回日期時間型別
select to_date('2004-05-07 13:23:44','yyyy-mm-dd hh24:mi:ss')    from dual

to_date(ch, fmt) 是將字串ch,按fmt格式,轉成date型別

to_char 是返回字串;(to_char是用法很多)

2、求某天是星期幾

select to_char(to_date('2022-03-16','yyyy-mm-dd'),'day') from dual; --星期三

3、求兩個日期間的天數

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

4、求當前日期的前一天

select to_char(trunc(sysdate-1),'yyyy-mm-dd') from dual;

5、計算時間差

oracle時間差是以天數為單位,所以換算成年月,日

select floor(to_number(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))/365) as spanYears from dual        --時間差-年
select ceil(moths_between(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanMonths from dual        --時間差-月
select floor(to_number(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))) as spanDays from dual             --時間差-天
select floor(to_number(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24) as spanHours from dual         --時間差-時
select floor(to_number(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60) as spanMinutes from dual    --時間差-分
select floor(to_number(sysdate-to_date('2022-03-16 15:55:03','yyyy-mm-dd hh24:mi:ss'))*24*60*60) as spanSeconds from dual --時間差-秒

6、求月份第一天、最後一天

--這個月的第一天,返回 2022-03-01 00:00:00
SELECT Trunc(SYSDATE, 'MONTH')  FROM dual; 
-- 這個月的最後一天,返回 2022-03-31 23:59:59
SELECT  LAST_DAY(Trunc(SYSDATE, 'MONTH')) + 1 - 1 / 86400 FROM dual;
-- 上個月的第一天,返回 2022-02-01 00:00:00
SELECT Trunc(Trunc(SYSDATE, 'MONTH') - 1, 'MONTH')  FROM dual;	
-- 上個月的最後一天,返回 2022-02-28 23:59:59
SELECT Trunc(SYSDATE, 'MONTH') - 1 / 86400 FROM dual;

字元函式

1、字串擷取

select substr('abcdef',1,3) from dual; -- abc

2、查詢子串位置

select instr('abcdefgigklmn','de') from dual; -- 4

3、字串連線

select 'HELLO'||'hello world' from dual; -- HELLOhello world

4、計算字串長度

select length('abcdefg') from dual; -- 7

5、去掉字串中的空格

select ltrim(' abc') from dual;	-- 去掉左邊空格
select rtrim('zhang ') from dual; -- 去掉右邊空格
select trim(' zhang san ') from dual;	-- 去掉左右兩邊的空格

6、去掉字首和字尾

select trim(leading 9 from 998234891299) from dual; --8234891299
select trim(trailing 9 from 998234891299) from dual; --9982348912
select trim(9 from 998234891299) from dual;		-- 82348912

7、替換字元

select replace('abcad','a','xyz') from dual; -- xyzbcxyzd
select translate('abcad','1','xyz') from dual; -- xbcxd

8、initcap(ch)首字母大寫、 lower(ch)變小寫、upper(ch)變大寫

select lower('ABC') s1, 
       upper('def') s2, 
       initcap('efg') s3
   from dual;

9、lpad(expr1, n, expr2) 左添充、 rpad(expr1, n, expr2) 右填充 用於控制輸出格式

select lpad('func',10,'=') from dual; -- ======func
select rpad('func',10,'=') from dual; -- func======