oracle FUNCTION(任意两个时间 之间的工作小时)

写函数计算 任意两个时间 之间的工作小时
每天工作时间(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;

oracle FUNCTION(任意两个时间 之间的工作小时)_第1张图片

你可能感兴趣的:(oracle,数据库)