Oracle常用數學、日期、字串函式
阿新 • • 發佈:2022-03-16
為了日常使用,這裡總結一些常用的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======