发现没有。一个月内的工作日,直到sysdate /今天的日期是当月

时间:2017-05-22 05:56:25

标签: oracle oracle11g

我使用以下查询来查找一个月内的工作日数,不包括周末

Error: response.data[1] is undefined

此处,payrollId是employee表中的employee_id,admin_holiday是一个表,其中包含有关一个月内国家法定假日的信息

我的要求是,如果月份是当月,那么工作日应该是今天的日期。例如,当前月份是2017年5月,直到今天(即2017年5月22日),不包括周末的工作日数为15(根据印度历,10月10日是国定假日。

我如何获得所需的结果。

注意 此操作必须在单个select语句中执行,而不是其他pl / sql块等。

1 个答案:

答案 0 :(得分:0)

以下是我将如何处理等效查询。通过将日期范围计算放入一个小的交叉连接查询中,您可以在查询的其余部分轻松访问结果。

SELECT
     e.payroll_id AS payrollId
  ,  cj. working_days
FROM employee e
cross join (
        select
             GREATEST(NEXT_DAY(start_date, 'MON') - start_date - 2, 0) 
            + ((NEXT_DAY(end_date, 'MON') - NEXT_DAY(start_date, 'MON'))/7)*5
            - GREATEST(NEXT_DAY(end_date, 'MON') - end_date - 3, 0) 
            - (
                  SELECT COUNT(holiday) 
                  FROM admin_holiday
                  WHERE holiday_date BETWEEN start_date AND end_date
               ) 
              as working_days
        FROM (
              select
                 to_date('20170501','yyyymmdd')  as start_date
               , to_date('20170522','yyyymmdd')  as end_date
              from dual
            )
        ) cj
WHERE e.DEL_FLAG = 1
ORDER BY e.payrollId

工作日逻辑是:

计算第一周的领先天数+(计算周一/周期的数字)* 5 - 最后一周的结束天数 - 表格中的额外假期:

select
      GREATEST(NEXT_DAY(start_date, 'MON') - start_date - 2, 0) 
    + ((NEXT_DAY(end_date, 'MON') - NEXT_DAY(start_date, 'MON'))/7)*5
    - GREATEST(NEXT_DAY(end_date, 'MON') - end_date - 3, 0) 
    - (
          SELECT COUNT(holiday) 
          FROM admin_holiday
          WHERE holiday_date BETWEEN start_date AND end_date
       ) 
      as working_days
    , start_date
    , end_date
    , holidays
    , end_date - start_date
FROM (
      select
         trunc(sysdate,'MM')  as start_date
       , trunc(sysdate)       as end_date
      from dual
    )

示例(这里没有零假期):

+--------------+--------------+-------------+------------+-------------------------+
| WORKING_DAYS | START_DATE   | END_DATE    | HOLIDAYS   |   END_DATE-START_DATE   |
+--------------+--------------+-------------+------------+-------------------------+
|           16 |  01.05.2017  | 22.05.2017  |          0 |                      21 |
+--------------+--------------+-------------+------------+-------------------------+

要手动设置日期,您可以执行以下操作:

select
      GREATEST(NEXT_DAY(start_date, 'MON') - start_date - 2, 0) 
    + ((NEXT_DAY(end_date, 'MON') - NEXT_DAY(start_date, 'MON'))/7)*5
    - GREATEST(NEXT_DAY(end_date, 'MON') - end_date - 3, 0) 
    - (
          SELECT COUNT(holiday) 
          FROM admin_holiday
          WHERE holiday_date BETWEEN start_date AND end_date
       ) 
      as working_days
FROM (
      select
         to_date('20170501','yyyymmdd')  as start_date
       , to_date('20170522','yyyymmdd')  as end_date
      from dual
    )