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 ...