将X天添加到收到的日期中,但从日期表中排除周末/假日

时间:2019-05-20 15:50:12

标签: db2

我希望有人可以帮助我进行开发时遇到的困难。

我正在DB2数据库中开发一个报表,当订单介于X和Y之间时,我需要在“已收到”日期/时间中添加“ X”天数;但不包括“周末和节假日”添加到接收日期。我创建了一个[TBLCALENDAR],其中列出了周末和假期(以下示例);从这开始,我想将X天数加到“ DUEDATE”

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

例如,如果我有一个订单于2019年1月18日下午4:01下达;截止日期应为2019年1月23日上午11:00。

示例2:如果我有一个定于1/18/2019在

下的订单

条件是: 上一个日期下午4:01到当前日期11:00 am =截止日期应为+“ X”个工作日,直到11:00 am 如果在当天下午4:00之前收到订单=截止日期应为在下午4:00之前加上“ X”个工作日

我试图引用tblCalendar来获取[已接收]日期/时间,并根据订单添加X天数,但是它没有达到我希望的方式。

我使用了以下代码...但是添加指定的天数时,它不排除“周末”或“假期”,或者我的订单时间要求要考虑4:00 pm后的前一天到当前的11点:上午00:

  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

预期的字段输出

如果在1/17/2019 4:01 pm至1/18/2019 10:59 am之间接收到订单= 1/23/2019 11:00 am 如果在1/18/2019 3:59 am当天4:00 pm之前收到订单,则在4:00 pm到2019/1/23。

RECEIVEDDATETIME    DUEDATE
1/17/2019 4:01pm    1/23/2019 11:00am
1/18/2019 10:00am   1/23/2019 4:00pm

2 个答案:

答案 0 :(得分:0)

解决方案: 您的tblCalendar是个好主意,但我建议添加工作日信息,而不是(仅)标记假期和周末。 “休假日”的问题在于,在您确定了从接收日期到接收日期+ X天的时间段内有多少天之后,您将不容易添加它们,因为那可能还有其他“休假日”再次是骨膜。

通过对所有工作日进行编号,您可以确定最接近(等于或大于)接收日期的工作日。检索其编号并将X天添加到该编号中。检索具有该工作日编号的日期,就可以了。 在此之前应该建立时间逻辑,因为它可能会使X天再增加一天。

答案 1 :(得分:0)

这是没有时间逻辑的解决方案。

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日期(sum(...) over(...)表达式)。
最后,我们选择一个日期,该日期具有相应的添加天数(第二个参数)。