① 如何處理資料庫的時間
oracle為例吧:
1.分鍾轉成不同格式的時間
資料庫里有個欄位 存的分鍾
① 現在想顯示成HH:MM格式 假設為514分鍾
SELECT to_char((to_date('00:00','HH24:MI')+514/24/60),'HH24:MI') from al
輸出結果:
08:34
②如果存的是秒 同理
SELECT to_char((to_date('00:00:00','HH24:MI:SS')+514/24/60/60),'HH24:MI:SS') from al
輸出結果:
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 al
看起來很復雜,而實際上就是把小時相加,分鍾相加,之後把分鍾滿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 al
同樣看起來很復雜
首先把HH:MM的換成數值:
to_date('08:30','HH24:MI') - trunc(to_date('08:30','HH24:MI'))
輸出結果:.(其實是代表了一個時間,是以天為單位的)
現在*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(時間是.)這兩個
也就是把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 al
輸出結果: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 al;
對當前日期增加50分種
SQL> select sysdate, sysdate+numtodsinterval(50,』minute』) from al ;
SYSDATE SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:39:12 2010-10-14 22:29:12
對當前日期增加45秒
SQL> select sysdate, sysdate+numtodsinterval(45,』second』) from al ;
SYSDATE SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:40:06 2010-10-14 21:40:51
對當前日期增加3天
SQL> select sysdate, sysdate+3 from al ;
SYSDATE SYSDATE+3
——————- ——————-
2010-10-14 21:40:46 2010-10-17 21:40:46
對當前日期增加4個月
SQL> select sysdate, add_months(sysdate,4) from al ;
SYSDATE ADD_MONTHS(SYSDATE,
——————- ——————-
2010-10-14 21:41:43 2011-02-14 21:41:43
對當前日期增加一個小時:
SQL> select sysdate, sysdate+numtodsinterval(1,』hour』) from al ;
SYSDATE SYSDATE+NUMTODSINTE
——————- ——————-
2010-10-14 21:38:19 2010-10-14 22:38:19
對當前日期增加50分種