oracle 函式綜合小例子 日期的操作等

2021-09-01 16:41:03 字數 4654 閱讀 7588

前提有一張學生表student  裡面有個birthday欄位(日期字段)

讓你求出 大於10歲的學生 這邊僅僅以年份判斷

這裡思路是把birthday與當前的日期相比 通過年份的差來判斷

首先要把日期型別轉化成字串,

to_char(obj,formart)

to_char(birthday,'yyyymmdd')   順帶一句

轉化成日期 to_date(str,formart)

to_date(sysdate,'yyyy-mm-dd') 

取得年份

substr(str,起始索引,擷取長度)

substr(to_char(birthday,'yyyymmdd'),0,4) )

字串轉化成數字

to_number函式 轉化成數字

to_number(substr(to_char(birthday,'yyyymmdd'),0,4) ))

最終sql

select * from student where birthday is not null

and (to_number(substr(to_char(sysdate,'yyyymmdd'),0,4)) -to_number(substr(to_char(birthday,'yyyymmdd'),0,4)))>10

如果是時分秒的話 yyyy-mm-dd hh24:mi:ss

row_number函式

有時候可用於oracle分頁(不建議相比其他2中分頁方式效率低)

row_number

() over ()

row_number() over ([partition by col1] order by col2) ) as 別名

表示根據col1分組,在分組內部根據 col2排序

而這個「別名」的值就表示每組內部排序後的順序編號(組內連續的唯一的),[partition by col1] 可省略。

例子 查詢各部門中薪水最高的前2位

select ename,job,deptno,sal,排名 from

(select ename,job,deptno,sal,(row_number() over(partition by deptno order by sal desc)) as 排名 

from scott.emp                   --先將各部門的員工按薪水排序,再在結果中取出需要的部分

) where 排名<=2;

參考功能

參考

trunc

trunc(用於擷取的數,擷取的長度)

trunc(123.56,0) ==123

trunc(123.56,1) ==123.5

trunc(123.56,2) ==123.56

trunc(123.56,3) ==123.56

trunc(123.56,-1)==120trunc(123.56,-2)==100

trunc(123.56,-3)==0

trunc(123.56,-4)==0

trunc還可以操作日期  

今天的日期

2013/5/14

trunc(sysdate)==2013/5/14

返回當前時間

yyyy-mm-dd hh:mm:ss  trunc(sysdate,'yyyy') ==2013/1/1  返回當年第一天

trunc(sysdate,'mm')==2013/5/1  返回五月份第一天

trunc(sysdate,'dd')==

2013/5/14

返回當前時間

trunc(sysdate,'hh')==2013/5/14 10:00:00

trunc(sysdate,'mi')==2013/5/14 10:14:00 分用mi  秒沒有提供方法

vsize(c)

返回c的位元組數

cast(『1』 as number(1)) 一般用於字串轉化成其他的

concat(c1,c2) 相當於 || 連線字串

nvl(c1,c2) 邏輯等價於if c1 is null then c2 else c1 end。c1,c2可以是任何型別。如果兩者型別不同,則oracle會自動將c2轉換為c1的型別。

nvl2(

expr1,

expr2,

expr3

)->expr1不為null,返回expr2;為null,返回expr3。expr2和expr3型別不同的話,expr3會轉換為expr2的型別

nullif函式語法為nullif(表示式1,表示式2),如果表示式1和表示式2相等則返回空值,如果表示式1和表示式2不相等則返回表示式1的結果。

wmsys.wm_concat 函式可以完成行轉列的效果

wmsys.wm_concat(列名)

詳見

lpad(原字元創,填充後總長度,填充字串)

lpad('asd',10,'*')==*******asd

sign函式

sign(value)  裡面的value大於0則返回1 小於0則返回-1 等於0則返回0

decode函式 相當於if else

decode(判斷語句,條件1,結果,條件2,結果....最後結果)

下面的意思是 如果teacher_name字串長度大於了36 就截斷 否則就取原來的

select decode(sign(vsize(teacher_name)-36),-1,teacher_name,substr(teacher_name,0,18))as jc_004  from base_teacher

--查詢某個字串

instr(gnfl_dm,'dsfxx',1,1)

從gnfl_dm欄位裡查詢 字元dsfxx 從gnfl_dm欄位的第乙個字元開始算,找到第乙個匹配的位置

關於數字的格式

使用fm***.***可以實現   dddd.***x  dddd是小數點前的位置***x是小數點後的位置。dddd需要預判最大有幾位,***x可以用來實現精度  注意 這裡的 990 小數點前一位要是0其他用9來代替 ,小數點後面的用0,否則會有 「100.」 這樣的後面帶點的資料

select to_char(mx.mxfz,'fm990.00') from fxyd_ydmx mx

詳見 

oracle比較一列的最大值或者最小值,我們會不假思索地用max和min函式,但是對於比較一行的最大值或最小值呢?是不是日常用的少,很多人都不知道有oracle也有內建函式實現這個功能:coalesce / greatest /least.

1. coalesce 返回該表示式列表的第乙個非空value。

格式: coalesce(value1, value2, value3, ...)

含義: 返回value列表第乙個非空的值。

value列表必須是相同型別,也可以是乙個表的同一行、不同列的值進行比較。

example: select coalesce (1, null, 2 ) from dual ; -- 返回1

select coalesce ( null, 2, 1 ) from dual ; -- 返回2

select coalesce (t.empno, t.mgr ) from  scott.emp t ; -- 效果類似 nvl( t.empno, t.mgr )

2. greatest 返回值列表中最大值

格式: greatest(value1, value2, value3, ...)

含義: 返回value列表最大的值。

value列表必須是相同型別,也可以是乙個表的同一行、不同列的值進行比較。

當value值列表中有乙個為null,則返回null值。

example: select greatest (1, 3, 2 ) from dual ; -- 返回3

select greatest ( 'a', 'b', 'c' ) from dual ; -- 返回c

select greatest (null, 'b', 'c' ) from dual ; -- 返回null

select greatest (t.empno, t.mgr ) from  scott.emp t ; -- 返回empno和mgr 較大值

3. least 返回值列表中最小值

格式: least(value1, value2, value3, ...)

含義: 返回value列表最小的值。

value列表必須是相同型別,也可以是乙個表的同一行、不同列的值進行比較。

當value值列表中有乙個為null,則返回null值。

example: select least (1, 3, 2 ) from dual ; -- 返回1

select least ( 'a', 'b', 'c' ) from dual ; -- 返回a

select least (null, 'b', 'c' ) from dual ; -- 返回null

select least (t.empno, t.mgr ) from  scott.emp t ; -- 返回empno和mgr 較小值

oracle函式綜合小例子日期的操作

oracle函式綜合小例子日期的操作 前提有一張學生表student 裡面有個birthday欄位 日期字段 讓你求出 大於10歲的學生 這邊僅僅以年份判斷 這裡思路是把birthday與當前的日期相比 通過年份的差來判斷 首先要把日期型別轉化成字串,to char obj,formart to c...

oracle判斷日期函式 儲存過程例子

一 判斷日期函式例子 sql create or replace function is date parmin varchar2 2 return number 3 is 4 val date 5 begin 6 val to date nvl parmin,a yyyy mm dd hh24 m...

ORACLE 日期函式

1.select to char to date 2011 5 1 yyyy mm dd day from dual 返回星期日 select to char to date 2011 5 1 yyyy mm dd day nls date language american from dual 返...