創(chuàng)建一個日期比較的函數(shù)(datediff,網(wǎng)上找的),然后通過該函數(shù)返回天數(shù)×8.5 就是總共的小時數(shù)了,如果要精確點的話,就把首尾天數(shù)中的時間差刨了即可。

為臨川等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及臨川網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站建設、網(wǎng)站建設、臨川網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
create or replace function datediff
(p_Component varchar2 ,
p_Subtranhend date,
p_Minuend date)
RETURN NUMBER
IS
/*************************************************************************/
/* 功 能:返回兩個日期之間的天、周、月、年等數(shù)量。 */
/* 入?yún)⒄f明: p_Component 時間元件,如年月日季度等等 */
/* p_Subtrahend 減數(shù)時間 */
/* p_Minuend 被減數(shù)時間 */
/*************************************************************************/
v_ReturnValue number ; -- 結果數(shù)值
v_Component varchar2(10); --日期組件中間轉換形式,截取空格并且轉為大寫
v_YearNum1 number; --減數(shù)年份數(shù)
v_YearNum2 number; --被減數(shù)年份數(shù)
v_MonthNum1 number; --減數(shù)月份數(shù)
v_MonthNum2 number; --被減數(shù)月份數(shù)
v_HourNum1 number; --減數(shù)時數(shù)
v_HourNum2 number; --被減數(shù)時數(shù)
v_MinuteNum1 number; --減數(shù)分鐘數(shù)
v_MinuteNum2 number; --被減數(shù)分鐘數(shù)
v_SecondNum1 number; --減數(shù)秒鐘數(shù)
v_SecondNum2 number; --減數(shù)秒鐘數(shù)
v_QuarterValue1 number; --減數(shù)季度數(shù)
v_QuarterValue2 number; --被減數(shù)季度數(shù)
v_WeekNum1 number; --減數(shù)與標準時間周差
v_WeekNum2 number; --被減數(shù)與標準時間周差
BEGIN
v_Component := upper(ltrim(rtrim(p_Component)));
if v_Component in ('Y','YY','YEAR','YYYY') then --年情況
v_YearNum1 := to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_ReturnValue := v_YearNum2 - v_YearNum1;
elsif v_Component in ('M', 'MM','MONTH', 'MON') then --月情況
--請注意,這個部分與oracle內(nèi)置日期函數(shù)MONTH_BETWEEN()不同,忽略了日因素
--而后者的兩個日期如都是所在月的最后一天,才返回整數(shù),否則,返回分數(shù)
--而且這個分數(shù)是以31天作為一個月進行計算的結果
v_YearNum1 := to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_MonthNum1 := to_number(to_char(p_Subtranhend,'MM'));
v_MonthNum2 := to_number(to_char(p_Minuend,'MM'));
v_ReturnValue := (v_YearNum2 - v_YearNum1)*12 + (v_MonthNum2 - v_MonthNum1);
elsif v_Component in ( 'D', 'DD', 'DAY') then --日情況
--這里與兩個日期直接相減的oracle日期算術也不同,只返回整數(shù)天數(shù);
--而后者可以返回一天的幾分之幾(以小數(shù)形式表達)
v_ReturnValue := to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),'YYYY-MM-DD');
elsif v_Component in ('H', 'HH', 'HOUR') then --時情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'), 'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
elsif v_Component in ('MI','MINUTE') then --分情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'), 'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分鐘數(shù)
v_MinuteNum1 := to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend,'MI'));
v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);
elsif v_Component in('S', 'SS', 'SECOND') then --秒情況
--第一步:求出天數(shù)
v_ReturnValue := (to_date(to_char(p_Minuend,'yyyy-mm-dd'),'YYYY-MM-DD')
- to_date(to_char(p_Subtranhend,'yyyy-mm-dd'),
'YYYY-MM-DD'));
--第二步:求出時數(shù)
v_HourNum1 := to_number(to_char(p_Subtranhend,'HH24'));
v_HourNum2 := to_number(to_char(p_Minuend,'HH24'));
v_ReturnValue := v_ReturnValue*24 + (v_HourNum2 - v_HourNum1);
--第三步:求出分鐘數(shù)
v_MinuteNum1 := to_number(to_char(p_Subtranhend,'MI'));
v_MinuteNum2 := to_number(to_char(p_Minuend,'MI'));
v_ReturnValue := v_ReturnValue*60 + (v_MinuteNum2 - v_MinuteNum1);
--第四步:求出秒鐘數(shù)
v_SecondNum1 := to_number(to_char(p_Subtranhend,'SS'));
v_SecondNum2 := to_number(to_char(p_Minuend,'SS'));
v_ReturnValue := v_ReturnValue*60 + (v_SecondNum2 - v_SecondNum1);
elsif v_Component in ('Q','QQ','QUARTER') then --季度情況
v_YearNum1 := to_number(to_char(p_Subtranhend,'YYYY'));
v_YearNum2 := to_number(to_char(p_Minuend,'YYYY')) ;
v_QuarterValue1 := to_number(to_char(p_Subtranhend,'Q'));
v_QuarterValue2 := to_number(to_char(p_Minuend,'Q'));
v_ReturnValue := (v_YearNum2 - v_YearNum1)*4 + (v_QuarterValue2 - v_QuarterValue1);
elsif v_Component in ('W','WW','WK','WEEK') then --周情況
--一周的起始日期應當為星期日
--關于周差的計算,嘗試采用中間日期的方法
--經(jīng)查,‘1-1-2’即公元一年1月2日為周日,我們就可以用兩個時間分別與其相減求周差
--兩個結果再相減,即可得到正確的數(shù)值
v_WeekNum1 := floor( (to_date(to_char(p_Subtranhend,'YYYY-MM-DD'),'YYYY-MM-DD') -
to_date('1-1-2','YYYY-MM-DD'))/7);
v_WeekNum2 := floor( (to_date(to_char(p_Minuend,'YYYY-MM-DD'),'YYYY-MM-DD') -
to_date('1-1-2','YYYY-MM-DD'))/7);
v_ReturnValue := v_WeekNum2 - v_WeekNum1;
else
v_ReturnValue := -88888;
end if;
RETURN v_ReturnValue;
EXCEPTION
WHEN OTHERS THEN
RETURN -99999;--例外處理
END datediff;
可以使用sql語句,將起始時間與結束時間相減就可以了,語句如下:
select TO_NUMBER(
TO_DATE('2018-6-5','yyyy-mm-dd hh24:mi:ss')- TO_DATE('2018-5-31','yyyy-mm-dd hh24:mi:ss'))AS 相差天數(shù) from dual;
擴展資料:
注意事項:
1、在使用Oracle的to_ date函數(shù)來做日期轉換時,可能會直覺地采用"yyyy-MM-dd HH:mm:ss"的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810格式代碼出現(xiàn)兩次”。
如: select to_ date(2005-01-01 13:14:20','yyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不區(qū)分大小寫, MM和mm被認為是相同的格式代碼,所以Oracle的SQL采用了mi代替分鐘。
select to_ date(2005-01-01 13:14:20'yyyy-MM-dd HH24:mi:s') from dual;
2、另要以24小時的形式顯示出來要用HH24
select to_ char(sysdate,'yyy-MM-dd HH24:miss') from dual;//mi是分鐘
select to_ char(sysdate,'yyy-MM-dd HH24:mm:ss') from dual://mm會顯示月份
select (to_date(to_char(sysdate,'hh24mi'),'hh24mi') - to_date('1820','hh24mi'))*1440 from dual;
兩個日期相減的結果,單位是天,因此將兩個日期相減,然后乘以1440,得到的結果就是“分鐘數(shù)”
延展閱讀:
甲骨文股份有限公司(NASDAQ:ORCL,Oracle)是全球大型數(shù)據(jù)庫軟件公司。總部位于美國加州紅木城的紅木岸(Redwood Shores),現(xiàn)時首席執(zhí)行官為公司創(chuàng)辦人勞倫斯·埃里森(Lawrence J. Ellison)。
2016年11月6日,甲骨文公司(Oracle)股東同意以 93 億美元的資金收購Netsuite公司,每股價格約為 109 美元。
Oracle WDP 全稱為Oracle Workforce Development Program,是Oracle (甲骨文)公司專門面向?qū)W生、個人、在職人員等群體開設的職業(yè)發(fā)展力課程。Oracle的技術廣泛應用于各行各業(yè),其中電信、電力、金融、政府及大量制造業(yè)都需要Oracle技術人才,Oracle公司針對職業(yè)教育市場在全球推廣的項目,其以低廉的成本給這部分人群提供Oracle技術培訓,經(jīng)過系統(tǒng)化的實訓,讓這部分人群能夠迅速掌握Oracle最新的核心技術,并能勝任企業(yè)大型數(shù)據(jù)庫管理、維護、開發(fā)工作。
設需要找昨天的數(shù)據(jù),表名為 a ,日期字段為 rq
select * from a where trunc(sysdate-1)=trunc(rq)
trunc 可以拿到時間的日期部分
具體你根據(jù)你的情況完善一下。
首先,2個日期必須為date型數(shù)據(jù),如果是字符型必須轉成date型,然后兩個日期直接相減就可以,方法如下:
比如查今天和2018年8月20日的時間差:
select?trunc(sysdate)-to_date('2018-08-20','yyyy-mm-dd')?from?dual
select?abs(trunc(sysdate)-to_date('2018-08-20','yyyy-mm-dd'))?from?dual
里邊用到的各種函數(shù)請自行百度。
以2015年12月1日至2015年12月31日為例。其中周六和周日算周末。
查詢除周末以外的天數(shù)(oracle中以周日為1,周一為2……周六為7),可用如下語句:
with?t?as
(select?rownum-1?rn?from?dual?connect?by?rownum=100)
select?count(*)?from?t?
where?to_char(to_date('2015-12-01','yyyy-mm-dd')+rn,'yyyy-mm-dd')?between?'2015-12-01'?and?'2015-12-31'?
and?to_char(to_date('2015-12-01','yyyy-mm-dd')+rn,'d')?not?in?(6,7);
查詢結果:
查日歷可得,2015年12月1日至2015年12月31日期間,周六周日的天數(shù)合計8天,31-8=23,與語句所得結果一致。
名稱欄目:oracle日期如何相減 oracle日期相減計算天數(shù)
文章鏈接:http://chinadenli.net/article16/hhghgg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供服務器托管、用戶體驗、網(wǎng)站維護、自適應網(wǎng)站、網(wǎng)站策劃、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)