前提有一張學生表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 返...