我希望有人可以帮助我进行开发时遇到的困难。
我正在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
答案 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(...)
表达式)。
最后,我们选择一个日期,该日期具有相应的添加天数(第二个参数)。