oracle 時間相加減

2021-06-20 18:01:54 字數 4566 閱讀 5101

1.分鐘轉成不同格式的時間

資料庫裡有個字段 存的分鐘

① 現在想顯示成hh:mm格式 假設為514分鐘

select to_char((to_date('00:00','hh24:mi')+514/24/60),'hh24:mi') from dual

輸出結果:

08:34

②如果存的是秒 同理  

select to_char((to_date('00:00:00','hh24:mi:ss')+514/24/60/60),'hh24:mi:ss') from dual

輸出結果:

00:08:34 

至於顯示成其他的格式,也就不成問題了

2.時分相加

至於為什麼要寫這個,是因為oracle裡沒有兩個時間相加的處理,兩個to_date相減可以,相加就出錯了:

資料庫裡有兩個字段 存的都是hh:mm格式的時間

假設乙個是本月上午缺勤時間合計: 08:30(8個半小時)

另外乙個是本月下午缺勤時間合計: 00:30(半小時)

現在想要總缺勤時間,顯示成 hh:mm格式

做法有兩種

① 正常的邏輯運算(**或者plsql實現的應該比這個容易的多,僅限於sql實現):

select  lpad((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0') || ':' ||

lpad(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0') from  dual 

看起來很複雜,而實際上就是把小時相加,分鐘相加,之後把分鐘滿60的小時進製,取餘的顯示:

取前兩位相加得小時:(是因為不確定資料儲存的格式是不是嚴格的hh:mm,而不能借正則分隔「:」)

(substr('08:30',1,2) + substr('00:30',1,2) 

取後兩位相加得分鐘:

(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)) 

把分鐘滿60的小時進製得顯示用的小時:

(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60 

現在小時算完了,不足兩位左補零:

lpad((substr('08:30',1,2) + substr('00:30',1,2)+(substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2))/60),2,'0')  

把分鐘取余得顯示用的分鐘:

mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60)

現在分鐘算完了,不足兩位左補零:

lpad(mod((substr('08:30',length('08:30')-1,2)+substr('00:30',length('00:30')-1,2)),60),2,'0') 

最後連上「:」就變成上述的sql,得到的時間用hh:mm顯示了

輸出結果:

09:00

②函式實現:

select to_char(to_date('00:00','hh24:mi') +(((to_date('08:30','hh24:mi') - trunc(to_date('08:30','hh24:mi'))) *24*60  + (to_date('00:30','hh24:mi') - trunc(to_date('00:30','hh24:mi'))) *24*60)/24/60),'hh24:mi') from dual

同樣看起來很複雜

首先把hh:mm的換成數值:

to_date('08:30','hh24:mi') - trunc(to_date('08:30','hh24:mi'))    

輸出結果:.354166666666666666666666666666666666666(其實是代表了乙個時間,是以天為單位的)

現在*24*60 

把數值換成分鐘:

(to_date('08:30','hh24:mi') - trunc(to_date('08:30','hh24:mi'))) *24*60 

輸出結果:510

也就是把

08:30 變成了510分

(to_date('00:30','hh24:mi') - trunc(to_date('00:30','hh24:mi'))) *24*60 

輸出結果:30(時間是.020833333333333333333333333333333333333)這兩個

也就是把00:30 變成了30分 

然後把兩個分鐘相加:

((to_date('08:30','hh24:mi') - trunc(to_date('08:30','hh24:mi'))) *24*60  + (to_date('00:30','hh24:mi') - trunc(to_date('00:30','hh24:mi'))) *24*60)

輸出結果:

540剩下的就是顯示處理了,和1裡面的做法一致:

to_char(to_date('00:00','hh24:mi') +(((to_date('08:30','hh24:mi') - trunc(to_date('08:30','hh24:mi'))) *24*60  + (to_date('00:30','hh24:mi') - trunc(to_date('00:30','hh24:mi'))) *24*60)/24/60),'hh24:mi')

輸出結果: 

3. 不論是方法①還是方法②,

這裡都存在乙個問題:如果時間相加之後超出23:59,系統就會報錯,目前我用的涉及不到這個 就沒寫出來,如果有用到的直接再轉成dd:hh:mm的格式就行了,也就是把小時數滿24的進製取顯示用的天 

select to_char(to_date('01 00:00','dd hh24:mi') +(((to_date('23:30','hh24:mi') - trunc(to_date('23:30','hh24:mi'))) *24*60  + (to_date('01:30','hh24:mi') - trunc(to_date('01:30','hh24:mi'))) *24*60)/24/60-1),'dd hh24:mi') from dual 

輸出結果:01 01:00(25小時)

oracle 時間相減

select to_char((to_date('1970-01-01', 'yyyy-mm-dd') +

(to_date('10:10:10', 'hh24:mi:ss') -

to_date('12:10:10', 'hh24:mi:ss'))), 'hh24:mi:ss')

from dual;

對當前日期增加50分種

sql> select sysdate, sysdate+numtodsinterval(50,』minute』) from dual ;

sysdate             sysdate+numtodsinte

——————- ——————-

2010-10-14 21:39:12 2010-10-14 22:29:12

對當前日期增加45秒

sql> select sysdate, sysdate+numtodsinterval(45,』second』) from dual ;

sysdate             sysdate+numtodsinte

——————- ——————-

2010-10-14 21:40:06 2010-10-14 21:40:51

對當前日期增加3天

sql> select sysdate, sysdate+3 from dual ;

sysdate             sysdate+3

——————- ——————-

2010-10-14 21:40:46 2010-10-17 21:40:46

對當前日期增加4個月

sql> select sysdate, add_months(sysdate,4) from dual ;

sysdate             add_months(sysdate,

——————- ——————-

2010-10-14 21:41:43 2011-02-14 21:41:43

對當前日期增加乙個小時:

sql> select sysdate, sysdate+numtodsinterval(1,』hour』) from dual ;

sysdate             sysdate+numtodsinte

——————- ——————-

2010-10-14 21:38:19 2010-10-14 22:38:19

對當前日期增加50分種

參考:

時間相加減函式

時間減1函式 create function f dateadd date datetime,datestr varchar 23 returns datetime asbegin declare bz int,s varchar 12 i int if datestr is null or dat...

oracle 時間加減

select sysdate,sysdate numtodsinterval 40,second from dual 對當前日期增加40秒 select sysdate,sysdate numtodsinterval 10,minute from dual 對當前日期增加10分鐘 select sy...

oracle 時間加減

sysdate 1 加一天 sysdate 1 24 加1小時 sysdate 1 24 60 加1分鐘 sysdate 1 24 60 60 加1秒鐘 類推至毫秒0.001秒 加法 select sysdate,add months sysdate,12 from dual 加1年 select ...