資料庫時間的各種處理方法

2021-08-06 05:42:49 字數 4566 閱讀 4478

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.在查詢資料庫的資料的時候 並把資料展示在瀏覽器中顯示 但是顯示的時間是 2019 07 01t07 24 07.000 0000 我們想的是展示成這樣 2019 07 01 15 34 49 只要需要在你的domain物件中的時間字段上面加上乙個註解 jsonformat timezone gm...

資料庫置疑的處理方法

步驟如下 1.新建乙個同名的資料庫 資料檔案與原來的要一致 2.再停掉sql server 注意不要分離資料庫 3.用原資料庫的資料檔案覆蓋掉這個新建的資料庫 4.再重啟sql server 5.此時開啟企業管理器時會出現置疑,先不管,執行下面的語句 注意修改其中的資料庫名 use master g...

資料庫置疑處理方法

1.新建乙個與置疑資料庫同名的資料庫 一定要保證檔名是相同的,包括資料檔名和日誌檔名 2.停掉sql server 3.刪除新資料庫的日誌檔案 4.用置疑資料庫的資料檔案 mdf 覆蓋掉這個新建的同名資料庫的資料庫檔案 5.再重啟sql server 6.執行以下語句 use master go e...