计算两段之间的天数

Joh*_*ohn 0 sql oracle calendar between

我有两张桌子.我想计算星期一到星期五的天数,仅在Hire_dt和日历月结束之间.

表A

Hire_DT         Id
 09/26/2018     1
Run Code Online (Sandbox Code Playgroud)

TableCalendar:

Date         WorkDay(M-F)      EOM        WorkDay
09/26/2018     Wednesday       9/30/2018    1
09/27/2018     Thursday        09/30/2018   1
09/28/2018     Friday          09/30/2018   1
09/29/2018     Saturday        09/30/2018   0
09/30/2018     Sunday          09/30/2018   0
Run Code Online (Sandbox Code Playgroud)

预期成绩

Hire_dt        WorkDaysEndMonth   WorkDaysEndMonth --counting hire_dt
 09/26/2018         2                 3
Run Code Online (Sandbox Code Playgroud)

mat*_*guy 5

这是一种进行计算的方法 - 没有使用日历表.唯一的输入数据来自您的第一个表(ID和HIRE_DATE),我将其包含在WITH子句中(不是回答您问题的查询的一部分!).其他一切都是计算出来的.我将展示如何计算包含雇用日期的天数; 如果你不需要,最后减去1.

TRUNC(<date>, 'iw')是本周的星期一<date>.该查询计算EOM周中星期一和EOM之间的天数,但不超过5天(如果EOM可能是星期六或星期日).它对HIRE_DATE进行类似的计算,但它计算从星期一到星期六的天数,不包括 HIRE_DATE.最后一部分是在HIRE_DATE的星期一和EOM的星期一之间每整周增加5天.

with
  sample_data(id, hire_date) as (
    select 1, to_date('09/26/2018', 'mm/dd/yyyy') from dual union all
    select 2, to_date('07/10/2018', 'mm/dd/yyyy') from dual
  )
select id, to_char(hire_date, 'Dy mm/dd/yyyy')                      as hire_date,
       to_char(eom, 'Dy mm/dd/yyyy')                                as eom,
       least(5, eom - eom_mon + 1) - least(5, hire_date - hire_mon)
       + (eom_mon - hire_mon) * 5 / 7                               as workdays
from   (
         select id, hire_date, last_day(hire_date) as eom,
                trunc(hire_date, 'iw')             as hire_mon,
                trunc(last_day(hire_date), 'iw')   as eom_mon
         from   sample_data
       )
;

        ID HIRE_DATE               EOM                       WORKDAYS
---------- ----------------------- ----------------------- ----------
         1 Wed 09/26/2018          Sun 09/30/2018                   3
         2 Tue 07/10/2018          Tue 07/31/2018                  16
Run Code Online (Sandbox Code Playgroud)