oracle 时间相减函数本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班,

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/15 17:29:17
oracle 时间相减函数本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班,

oracle 时间相减函数本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班,
oracle 时间相减函数
本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班,
周六周日去除

oracle 时间相减函数本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班,
创建一个日期比较的函数(datediff,网上找的),然后通过该函数返回天数×8.5 就是总共的小时数了,如果要精确点的话,就把首尾天数中的时间差刨了即可.
create or replace function datediff
(p_Component varchar2 ,
p_Subtranhend date,
p_Minuend date)
RETURN NUMBER
IS
//
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;

oracle 时间相减函数本人现有一个表aaaa 其中e是起始时间(包含日期) f 是终止时间(包含日期)要求求出从起始时间到终止时间具体是多长时间,下班时间不包括在内,每天4:30下班,8点上班, oracle中的nvl函数 oracle中加天数函数,是哪个函数?两个时间相减得到是个什么?我要求一个时间点到当前时是否间隔了3天?HO oracle里sysdate-trunc(sysdate)函数得出的值是什么意思sysdate是取当前日期、时间,trunc(sysdate)是只取日期,相减不是应该是时间么,但是select Days,A,TRUNC(A*24) Hours,TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,TRUNC(A*24*6 简单的oracle问题本人数据库菜鸟,新装了oracle数据库,安装数据库的过程中,系统默认给建了一个数据库,我想查查这个数据库中都有什么东西,比如都有哪几张表,表中都有哪些字段,表中都有什么 Oracle中获取系统时间前一天的函数为sysdate - interval '1' dayOracle中获取系统时间前一天的函数为sysdate - interval '1' day 现在有一个语句to_date('0827’,’mm/dd’) 我想把语句里面的时间换成系统时间 ORACLE BETWEEN之间写时间怎么写 Oracle round函数是什么意思?怎么运用? Oracle中lag函数怎么用 oracle中的over函数怎么用的, oracle里两个timestamp类型相减,得到的结果如何转变为number类型如题语句是这样的,我想用当前时间减去某个表里的一个timestamp类型的一个数据,然后得到一个number类型的结果,语句如下:sysdate-tabl oracle 查看同义词oracle 中,加入我有一个同义词 s,我怎么查看这个同义词的信息,比如怎么查看这个同义词是指向哪个表的. oracle 中如何创建一个函数用来判断输入的数字正负零,并且在一个名为count表(num1 number)中查出所有正我是想重写那个方法. Oracle数据库中如何查询一个用户A下面所有的表的信息 oracle partition只能为一个表分一次区吗 如果可以分多区 该怎么写 oracle 一个表中的两列先分别求和再进行除法运算,语句怎么写 oracle 如何查看建表时间?创建一张表,用什么语法能查到它是什么时候见的呢, oracle中decode函数的应用问题.decode(to_char(sgldate,'yyyy-mm-dd'),if1,sglxssr/10000,null),if1这里我想取一个时间段 就是能使sgldate的时间取值在12年7月23日至7月39日这一段时间内,请问如何写这个if1条件?