Добавьте X дней к полученной дате, но исключите выходные / праздничные дни из таблицы дат - PullRequest
0 голосов
/ 20 мая 2019

Я надеюсь, что кто-то может помочь с вычислением, что у меня возникают проблемы при разработке.

Я разрабатываю отчет в базе данных DB2, в котором мне нужно добавить число дней "X" к дате / времени "ПОЛУЧЕНО", когда заказ поступает между X и Y;но исключая выходные и праздничные дни, чтобы добавить к полученной дате.Я создал [TBLCALENDAR], в котором перечислены выходные и праздничные дни (пример ниже);и из этого я хочу добавить X количество дней к «DUEDATE»

tblCalendar]
DATE                   DAYOFWK  DAY      HOLIDAY
1/19/2019                  7    Saturday    
1/20/2019                  1    Sunday  
1/21/2019                  2    Monday       YES

Так, например, 1, если у меня есть заказ, который размещен 18.01.2009 в 16:01.;срок исполнения должен быть 23.01.2009 в 11:00 утра.

Пример 2: если у меня есть заказ, который размещен 18.01.2009 в

Условия: Предыдущая дата4:01 вечера до текущей даты 11:00 утра = срок исполнения должен быть + "X" рабочих дней до 11:00 утра. Если заказ получен Текущий день до 16:00 вечера = срок исполнения должен быть + "X" рабочих дней до 4:00 вечера

Я попытался сослаться на tblCalendar, чтобы получить дату и время [Получено] и добавить X дней в зависимости от заказа, но он не работает так, как я надеялся.

Я использовал следующий код ... но он не исключает выходные или праздничные дни при добавлении указанного количества дней или требование моего времени заказа учитывать предыдущий день после 16:00 до текущей даты11:00 утра: * 10101 *

  RECEIVEDDATETIME + 2 days as DUEDATE;

Я также использовал приведенный ниже код для ссылки на TBLCALENDAR, чтобы найти количество выходных и выходных в диапазоне дат:

         ( SELECT COUNT (*) FROM TBLCALENDAR AS C WHERE C.HOLIDAY = 'YES'
            AND C.DATE BETWEEN TBLORDERS.RECEIVEDDATETIME 
            AND TBLORDERS.DUEDATETIME) +
            (SELECT COUNT (*) FROM TBLCALENDAR 
            WHERE DAYOFWK IN (1,7)
            AND DATE BETWEEN TBLORDERS.RECEIVEDDATETIME 
            AND TBLORDERS.UPLOADTIME) AS NONWORKINGDAYS

Ожидаемый выходной результат

Если заказ был получен в период с 17.01.2009 4:01 до 18.01.2009 10:59 = 23.01.2009 11:00 Если заказ получен Текущий день до 16:00 1/18 /2019 3:59 утра = 23 января 2009 года до 16:00.

1023 *

Ответы [ 2 ]

0 голосов
/ 21 мая 2019

Вот решение без логики времени.

with tblCalendar(DATE, DAYOFWK, DAY, HOLIDAY) as (values
  (date('2019-01-19'), 7, 'Saturday', '')     
, (date('2019-01-20'), 1, 'Sunday', '')
, (date('2019-01-21'), 2, 'Monday', 'YES')
, (date('2019-01-22'), 3, 'Tuesday', '')
, (date('2019-01-23'), 4, 'Wednesday', 'YES')
, (date('2019-01-24'), 5, 'Thursday', '')
, (date('2019-01-25'), 6, 'Friday', '')
, (date('2019-01-26'), 7, 'Saturday', '')
)
, mytab (RECEIVEDDATE, DAYS2ADD) as (values 
  (date('2019-01-19'), 2)     
, (date('2019-01-20'), 2)
, (date('2019-01-21'), 2)
, (date('2019-01-22'), 2)
)
select m.*, t.date as DUEDATE
--, dayofweek(date) as DAYOFWK, dayname(date) as DAY
from mytab m
, table
(
  select date
  from table 
  (
    select 
      date
    , sum(case when HOLIDAY='YES' or dayofweek(date) in (7,1) then 0 else 1 end) over (order by date) as dn_
    from tblCalendar t
    where t.date > m.RECEIVEDDATE
  )
  where dn_ = m.DAYS2ADD
  fetch first 1 row only
) t;

Идея состоит в том, чтобы перечислять каждый день календаря после RECEIVEDDATE (1-й параметр), начиная с 1, со следующей логикой:число каждого дня увеличивается на 1, если это не выходной день, а не выходной (выражение sum(...) over(...)).
Наконец, мы выбираем дату с соответствующим количеством дней, которое необходимо добавить (2-й параметр).

0 голосов
/ 21 мая 2019

Идея решения: Ваш tblCalendar - хорошая идея, но я рекомендую добавить информацию о рабочем дне вместо (только) отметки выходных и праздничных дней.Проблема с «выходными днями» заключается в том, что после того, как вы выяснили, сколько из них находится в периоде от даты получения до даты получения + X дней, вы не сможете легко добавить их, потому что в этом могут быть другие «выходные дни».снова perios.

По нумерации всех рабочих дней вы можете определить рабочий день, который ближе всего (равен или больше) к дате получения.Получить его номер и добавить X дней к этому номеру.Получить дату, которая имеет этот номер рабочего дня, и вы в порядке.Логика времени должна быть построена до этого всего, потому что это может добавить еще один день к X дням.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...