0

你能帮我计算一下吗?开始日期和结束日期之间的工作日数,不包括周末和特定业务假日。假设我们采用开始日期、结束日期和自定义假期表以及下面提到的假期日期列表。

开始日期 (mm/dd/yyyy hh24:mi:ss) : '10/15/2012 08:00:00'

结束日期 (mm/dd/yyyy hh24:mi:ss) : '10/23/2012 10:30:00'

holiday_table.business_holiday_date 值(月/日/年)

2012 年 10 月 17 日

2012 年 10 月 19 日

2012 年 10 月 22 日

需要通过考虑计算中日期的时间部分来计算工作日(因此可以预期带有分数的工作日,例如 1.25、3.7 等)

感谢您能尽快帮助我。

-詹姆士

4

2 回答 2

0

尝试:

SELECT(end_date - start_date) - 
(select count(*) 
 from holiday_table 
 where business_holiday_date >= start_date
 and business_holiday_date <= end_date)
FROM dual

是一个小提琴

于 2012-10-21T09:42:26.927 回答
0

我有一个只使用 2 个日期的函数,但你可以改进它。干得好...

  1. 首先检查您在假期表中有多少天,不包括周末。
  2. 获取两个日期之间的工作日(周一至周五),然后减去假期。

    create or replace
    FUNCTION calculate_business_days (p_start_date IN DATE, p_end_date IN DATE)
            RETURN NUMBER IS
            v_holidays     NUMBER;
            v_start_date   DATE   := TRUNC (p_start_date);
            v_end_date     DATE   := TRUNC (p_end_date);
            BEGIN
            IF v_end_date >= v_start_date
            THEN
                    SELECT COUNT (*)
                    INTO v_holidays
                    FROM holidays
                    WHERE day BETWEEN v_start_date AND v_end_date
                    AND day NOT IN (
                            SELECT hol.day 
                            FROM holidays hol 
                            WHERE MOD(TO_CHAR(hol.day, 'J'), 7) + 1 IN (6, 7)
                    );
    
            RETURN   GREATEST (NEXT_DAY (v_start_date, 'MON') - v_start_date - 2, 0)
                 +   (  (  NEXT_DAY (v_end_date, 'MON')
                         - NEXT_DAY (v_start_date, 'MON')
                        )
                      / 7
                     )
                   * 5
                 - GREATEST (NEXT_DAY (v_end_date, 'MON') - v_end_date - 3, 0)
                 - v_holidays;
            ELSE
                    RETURN NULL;
            END IF;
    END calculate_business_days;
    

之后,您可以对其进行测试,例如:

    select 
            calculate_business_days('21-AUG-2013','28-AUG-2013') as business_days 
    from dual;
于 2013-08-21T15:11:51.687 回答