日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

oracle数据库常用的函数总结

發布時間:2023/12/10 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle数据库常用的函数总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

oracle數據庫常用的函數總結

1.前言
在日常開發中,有些企業使用oracle數據庫作為項目的數據存儲容器,我就總結哈自己遇到的一些函數的用法。
2.總結的函數
2.1extract
extract:
oracle中extract()函數從oracle 9i中引入,用于從一個date或者interval類型中截取到特定的部分
用法:

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; extract(year from systimestamp) year,extract(month from systimestamp) month,extract(day from systimestamp) day select extract(year from interval '21' year) year from dual

2.2sign
sign:
sign函數是根據給的數為正數,就返回1,0返回0,負數返回-1,我感覺這個函數用的蠻多的。需要注意sign(這個括號里面只能是個字段),我測試了,在括號中寫個子查詢直接就報錯了
用法:

//需求:查物品,需要區分該物品的盈利情況,比如 goods_interest字段,有0.23,0,-0.23等 select sign(goods_interest)as interest_flag from goods //效果是:1,0,-1

2.3decode
decode函數:就是給某個值取一個值,我感覺他非常好用,感覺很像java中的switch的用法,在字段存char類型數字表示不同漢字含義,通過這個函數,查出來,前端可以直接顯示,不需要再轉一道漢字,后端的導出也是一步到位,不需要再使用switch轉漢字,簡化代碼。
用法:
decode(條件,值1,返回值1,值2,返回值2,…值n,返回值n,缺省值)

selectdecode(PROBLEM_LEVEL,1,'一般',2,'較大',3,'重大')as PROBLEM_LEVELfrom accident//效果:如果PROBLEM_LEVEL是2,查出來就是較大

2.4to_date和to_char
to_date和to_char:因為這兩個函數使用頻率太高,放一起解釋;to_date:是將oracle中時間樣式的字符串或時間類型數據格式化為時間類型的數據(yyyy-MM-dd,yyyy-MM等等不同的時間樣式),to_char是將當前值變成字符串類型,在時間處理方面,可以將時間類型的轉化為字符串匹配,比如數據庫存的時間類型,但后臺接收的是一個字符串,格式是yyyy-MM,那么可以轉字符串比,也可以轉時間比,但注意只比較年月,其他內容截取
案例:

to_date(a.CHECK_TIME,"yyyy-MM-dd")>=to_date(#{param.startTime},"yyyy-MM-dd") to_char(ss.P_TIME,'yyyy-mm-dd') >= to_char(#{param.startTime},'yyyy-mm-dd')

對to_char 和 to_date函數的補充:
測試代碼:

select time from (select sysdate as time from dual)select to_date(time) from (select sysdate as time from dual)select to_date(time,'yyyy-MM-dd hh:mm:ss')from (select sysdate as time from dual)select to_date(time,'yyyy-MM-dd hh:mi:ss')from (select sysdate as time from dual)select to_char(time,'yyyy-MM-dd hh:mi:ss')from (select sysdate as time from dual)select to_char(time,'yyyy-MM-dd')from (select sysdate as time from dual)select to_char(time,'yyyy-MM')from (select sysdate as time from dual)select to_date('2022-6-25','yyyy-MM-dd') from (select sysdate as time from dual)select to_char('2022-6-25','yyyy-MM-dd')from (select sysdate as time from dual)select to_date('2022-6-25') from (select sysdate as time from dual)select to_char(time)from (select sysdate as time from dual)select * from dual where to_char(to_date('2022-6-10 10:12:20','yyyy-MM-dd hh:mi:ss'),'yyyy-MM-dd')<to_char(sysdate,'yyyy-MM-dd')

按系統時間來舉例:

當to_date(時間類型的數據)時,會默認保留年月日

這里可以發現oracle中對M和m是區分不了的,才報了格式代碼出現了兩次,解決方案是將mm表示分鐘的改成mi表示分鐘

你會發現mm變成mi后還是報錯了,因為to_date(時間類型的數據)再給一個時間轉化格式,to_date函數不支持了,那如果我想指保留年月該咋辦?可以使用trunc函數,trunc函數專門解決這個的,我文章最后會補充這個函數

當上邊的to_date 改為to_char后,就可以將時間類型的數據按照‘yyyy-MM-dd hh:mm:ss’的時間格式樣式變成字符串類型了

當然,我們使用to_char可以將時間類型的保留年月日信息變成字符串,也可以保留年月信息變成字符串


那也可以to_date(符合時間格式的字符串,時間格式)將時間格式的字符串變成時間類型的數據

嘗試用to_char(時間格式的字符串,對應時間格式樣式)將字符串弄成字符串,直接報內容識別不了

嘗試to_date(時間格式的字符串)不寫對應時間格式樣式,直接解析失敗

to_char(時間類型數據)會按oracle中時間默認解析的時間格式樣式來解析,比如我這的,就是這個樣子

可以使用字符串類型的時間進行篩選

根據上述測試大概做個總結:
1.to_date():括號中可以是時間類型的數據,但不能再寫時間格式樣式,不然報錯解析不了
2.to_date()括號中可以是字符串,但該字符串必須是滿足時間格式的,并且要寫上對應的時間格式樣式,不然解析字符串失敗
3.to_char()括號中可以是時間類型的數據,可以寫時間格式樣式,也可以不寫,不寫時間格式樣式就會使用oracle中默認的時間格式樣式來轉化。
4.oracle中對大寫字母和小寫字母區分不了,在寫時間格式樣式涉及月和分的要注意,月M,分m,oracle是識別不了的,要區分一哈,oracle中規定分用mi表示,也就是月分 MM mi
5.可以使用to_char()處理后的字符串類型的時間進行時間的篩選,也可以使用to_date()處理后的時間類型的時間進行刷選

2.5to_number()
to_number()函數是oracle中常用的類型轉換函數之一,是將一些處理過的按一定格式編排過的字符串變回數值型的格式。我在展示long類型的id,需要使用這個,不然太長會按照科學計數法展示
1、to_number()函數可以將char或varchar2類型的string轉換為一個number類型的數值;

2、需要注意的是,被轉換的字符串必須符合數值類型格式,如果被轉換的字符串不符合數值型格式,Oracle將拋出錯誤提示;

3、to_number和to_char恰好是兩個相反的函數;
用法:

(1)to_number(varchar2 or char,'格式')select to_number('000012134') from dual; select to_number('88877') from dual; (2)如果數字在格式范圍內的話,就是正確的,否則就是錯誤的;如:select to_number('$12345.678', '$999999.99') from dual; select to_number('$12345.678', '$999999.999') from dual; (3)可以用來實現進制轉換;16進制轉換為10進制:select to_number('19f','xxx') from dual; select to_number('f','xx') from dual;

2.6add_months
add_months 函數主要是對日期函數進行操作,在數據查詢的過程中進行日期的按月增加,其形式為:
add_months(date,int);其中第一個參數為日期,第二個為按月增加的幅度,例如:
add_months (sysdate,2):就是當前日期的兩個月之后的時間。注意:沒有add_year,想要年的效果,在月的add_months(sysdate,12)12月就是一年,這樣效果和year一樣了
案例:

查詢當前時間1個月以后的時間: select add_months(sysdate,1) from dual; 查詢當前時間1個月以前的時間: select add_months(sysdate,-1) from dual;

2.7last_day
last_day()返回包含了日期參數的月份的最后一天的日期
案例:

select last_day(date'2000-02-01') "Leap Yr?" from dual 結果:29

2.8 round
round函數是用于對數字進行截取操作,且會對截取的數字進行四舍五入運算
案例:

round((sh.S_CURRENT_PRODUCT_TOTAL/sh.S_EXPECT_PRODUCT_TOTAL*100),2)效果:數字四舍五入,保留兩位小數

2.9concat
concat:拼接函數,使用場景:將多個字段合在一起,比如year字段和month字段合在一起成年月格式了
案例:

to_date(concat(sh.YEAR,sh.MONTH),'yyyyMM')=#{parm.timeInfo}

2.10 row_number() over(partition by b.pid order by p_time desc)

案例:

//實現需求是:對數據先按最新時間排序,然后我只要最新時間的pid的數據(就是數據中有一樣的pid,我們要去重,但要保留最新的這個pid的數據) select id,pid,p_time from(select b.id,b.pid,b.p_time,row_number() over(partition by pid order by p_time) rn from SP_PRODUCER_WELL a,SP_WELL_DAILY_STATS b where a.id=b.pid and a.DEL_FLAG=0 and b.DEL_FLAG=0order by b.P_TIME desc) bbwhere rn=1

3.結語:
目前我遇到的常用的函數就這些,后續還有,我會補充,最后希望這些函數能給你的業務思路帶來靈感,更易實現需求。

補充:
substr函數格式 (俗稱:字符截取函數):
這篇文檔寫的可以,可以參考:https://www.cnblogs.com/dshore123/p/7805050.html
trunc函數:
trunc函數:用法有兩種:TRUNC(NUMBER)表示截斷數字,TRUNC(date)表示截斷日期
截斷數字:TRUNC(n1,n2),n1表示被截斷的數字,n2表示要截斷到那一位。n2可以是負數,表示截斷小數點前。注意,TRUNC截斷不是四舍五入。

截斷日期:參數可以是dd,d,y,yy,mi,mm
基礎數據:

案例:








參考資料:
https://www.cnblogs.com/weihuang6620/p/6903961.html
https://www.jb51.net/article/168512.htm

總結

以上是生活随笔為你收集整理的oracle数据库常用的函数总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。