oracle将两个时间相减_oracle 时间相减函数

展开全部

创建一个日期比较的函数(datediff,网32313133353236313431303231363533e58685e5aeb931333262383565上找的),然后通过该函数返回天数×8.5 就是总共的小时数了,如果要精确点的话,就把首尾天数中的时间差刨了即可。

create or replace function datediff

(p_Component varchar2 ,

p_Subtranhend date,

p_Minuend date)

RETURN NUMBER

IS

/*************************************************************************/

/* 功 能:返回两个日期之间的天、周、月、年等数量。 */

/* 入参说明: p_Component 时间元件,如年月日季度等等 */

/* p_Subtrahend 减数时间 */

/* p_Minuend 被减数时间 */

/*************************************************************************/

v_ReturnValue number ; -- 结果数值

v_Component varchar2(10); --日期组件中间转换形式,截取空格并且转为大写

v_YearNum1 number; --减数年份数

v_YearNum2 number; --被减数年份数

v_MonthNum1 number; --减数月份数

v_MonthNum2 number; --被减数月份数

v_HourNum1 number; --减数时数

v_HourNum2 number; --被减数时数

v_MinuteNum1 number; --减数分钟数

v_MinuteNum2 number; --被减数分钟数

v_SecondNum1 number; --减数秒钟数

v_SecondNum2 number; --减数秒钟数

v_QuarterValue1 number; --减数季度数

v_QuarterValue2 number; --被减数季度数

v_WeekNum1 number; --减数与标准时间周差

v_WeekNum2 number; --被减数与标准时间周差

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内置日期函数MONTH_BETWEEN()不同,忽略了日因素

--而后者的两个日期如都是所在月的最后一天,才返回整数,否则,返回分数

--而且这个分数是以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日期算术也不同,只返回整数天数;

--而后者可以返回一天的几分之几(以小数形式表达)

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 --时情况

--第一步:求出天数

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'));

--第二步:求出时数

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 --分情况

--第一步:求出天数

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'));

--第二步:求出时数

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);

--第三步:求出分钟数

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 --秒情况

--第一步:求出天数

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'));

--第二步:求出时数

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);

--第三步:求出分钟数

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);

--第四步:求出秒钟数

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 --周情况

--一周的起始日期应当为星期日

--关于周差的计算,尝试采用中间日期的方法

--经查,‘1-1-2’即公元一年1月2日为周日,我们就可以用两个时间分别与其相减求周差

--两个结果再相减,即可得到正确的数值

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;

本回答由提问者推荐

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值