Подсчет дней между двумя сегментами - PullRequest
0 голосов
/ 24 октября 2018

У меня есть две таблицы ниже.Я хочу посчитать количество дней с понедельника по пятницу только между Hire_dt и концом календарного месяца, на который подпадает дата проката.

TableA

Hire_DT         Id
 09/26/2018     1

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

Ожидаемые результаты

Hire_dt        WorkDaysEndMonth   WorkDaysEndMonth --counting hire_dt
 09/26/2018         2                 3

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вот один из способов сделать расчет - БЕЗ использования таблицы календаря.Единственными входными данными являются данные из вашей первой таблицы (ID и HIRE_DATE), которые я включил в предложение WITH (не является частью запроса, который отвечает на ваш вопрос!).Все остальное рассчитывается.Я показываю, как рассчитать количество дней, включая дату найма;если вам это не нужно, в конце вычтите 1.

TRUNC(<date>, 'iw') - понедельник недели <date>.Запрос вычисляет, сколько дней в неделе МНВ, между понедельником и МНВ, но не более 5 (в случае, если МНВ может быть субботой или воскресеньем).Он выполняет аналогичные вычисления для HIRE_DATE, но считает дни с понедельника до HIRE_DATE , исключая HIRE_DATE.Последняя часть добавляет 5 дней для каждой полной недели между понедельником HIRE_DATE и понедельником EOM.

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
0 голосов
/ 25 октября 2018

Вы можете использовать следующую подпрограмму (, где функция last_day является большим вкладом ):

SQL> alter session set NLS_TERRITORY="AMERICA";
SQL> create table TableA( ID int, Hire_DT date );
SQL> insert into TableA values(1,date'2018-09-26');

SQL> select sum(case when mod(to_char(myDate,'D'),7) <= 1 then 0 else 1 end )
         as "WorkDaysEndMonth"
       from 
       (
         select Hire_DT + level - 1 myDate
           from TableA
          where ID = 1
        connect by level <= last_day(Hire_DT) - Hire_DT + 1
       );

 WorkDaysEndMonth
 ----------------
        3

Целочисленное значение PS получается из to_char(<date>,'D') в зависимости отNLS_TERRITORY настройка.Здесь я использовал AMERICA, для которого Saturday - это 7th, а Sunday - это 1st день, а для UNITED KINGDOM (или моей страны TURKEY) это 6th и 7thсоответственно.

Rextester Demo

...