【问题标题】:Business days calculation (by including time portion) between start date and end date by excluding weekends and custom/business specific holidays开始日期和结束日期之间的工作日计算(包括时间部分),不包括周末和自定义/业务特定假期
【发布时间】:2012-10-10 15:27:34
【问题描述】:

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

开始日期 (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 值(mm/dd/yyyy)

2012 年 10 月 17 日

2012 年 10 月 19 日

2012 年 10 月 22 日

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

如果您能尽快帮助我,不胜感激。

-詹姆斯

【问题讨论】:

  • 詹姆斯您好,欢迎来到 StackOverflow。考虑用你迄今为止的尝试来扩展你的问题。详情请见How to Ask

标签: oracle oracle10g oracle11g


【解决方案1】:

试试:

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

Here 是个小提琴

【讨论】:

    【解决方案2】:

    我有一个只使用 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2012-04-20
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多