写函数计算 任意两个时间 之间的工作小时
每天工作时间(8:00 - 20:00 共12小时),没有休息日
CREATE OR REPLACE FUNCTION SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC (
p_current_time IN DATE,
p_order_time IN DATE
) RETURN NUMBER
AS
p_work_hours NUMBER := 0;
p_work_time DATE := p_order_time;
v_hours NUMBER := 0;
BEGIN
-- 计算第一天的工作时间
IF TRUNC(p_current_time) >= TRUNC(p_work_time) THEN
IF TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) >= 8 AND TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) < 20 THEN
v_hours := (p_current_time - p_work_time) * 24 ;
ELSIF TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) >= 20 THEN
v_hours := 20 - (TO_NUMBER(TO_CHAR(p_work_time, 'HH24')) + TO_NUMBER(TO_CHAR(p_work_time, 'MI')/60)); -- 20:00到次日08:00共计12小时
END IF;
p_work_hours := p_work_hours + v_hours ;
p_work_time := p_work_time + 1;
END IF;
-- 计算中间整天的工作时间
WHILE TRUNC(p_work_time) < TRUNC(p_current_time) LOOP
p_work_hours := p_work_hours + 12;
p_work_time := p_work_time + 1;
END LOOP;
-- 计算最后一天的工作时间
IF TRUNC(p_work_time) = TRUNC(p_current_time) THEN
IF TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) >= 8 AND TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) < 20 THEN
v_hours := (p_current_time - (TRUNC(SYSDATE) + INTERVAL '8' HOUR)) * 24 ;
ELSIF TO_NUMBER(TO_CHAR(p_current_time, 'HH24')) >= 20 THEN
v_hours := 12;
END IF;
p_work_hours := p_work_hours + v_hours ;
p_work_time := p_work_time + 1;
END IF;
RETURN p_work_hours;
END CALCULATE_WORK_HOURS_FUNC;
调用函数结果:
SELECT SC_YD_DESI.CALCULATE_WORK_HOURS_FUNC(
TO_DATE('2022-11-10 23:00:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_DATE('2022-11-07 10:50:00', 'YYYY-MM-DD HH24:MI:SS')
) AS work_hours
FROM DUAL;