我需要在Oracle中计算下一个工作日(工作日是星期一到星期五)。在我们的报告程序中,我们使用了一个支持<|Tomorrow|>
的变量,但问题是客户没有收到需要的详细信息,比如星期一的交付,直到星期天这是毫无意义的,因为没有人在那里
因此,我们需要计算周一,周一,周一,周三,周三,周二,周四,周三,周五,周四。
直接在Oracle中执行此操作的最佳方法是什么,因为我们的报告程序似乎没有下一工作日变量。基本上我们需要将Where ORDER_HEADER.DELIVERY_DATE = '<|Tomorrow|>'
更改为Where ORDER_HEADER.DELIVERY_DATE = ** next business day **
这是Oracle 10g。
Select ORDER_HEADER.DELIVERY_DATE As "Delivery Date",
ORDER_HEADER.ORDER_NO As "Document No",
ORDER_HEADER.CUSTOMER_ORDER_NO As "Customer Order No",
ORDER_TOTALS.ORDER_TOTAL_QUANTITY As "Total Items",
ORDER_TOTALS.ORDER_TOTAL_NET As "Total Net"
From ORDER_HEADER
Inner Join ORDER_TOTALS On ORDER_HEADER.ORDER_NO = ORDER_TOTALS.ORDER_NO
Where ORDER_HEADER.DELIVERY_DATE = '<|Tomorrow|>' And ORDER_HEADER.CUSTOMER_NO = :Param1
Order By "Document No"
答案 0 :(得分:1)
这些事情通常都是通过一个表格来完成的,该表格列出了一年中的所有工作日,而不是像以下那样的天真公式:
CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5
THEN 1 + (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW'))
ELSE 1
END --(on monday to thursday this returns 2 to 5, on fri/sat/sun this returns 1)
CASE WHEN (1 + TRUNC (SYSDATE) - TRUNC (SYSDATE, 'IW')) < 5
THEN TRUNC (SYSDATE) + 1
ELSE TRUNC (SYSDATE + 4), 'IW')
END --(on monday to thursday this returns tomorrow's date, on fri/sat/sun it returns next monday's date)
使用表格可以考虑诸如银行假日,国定假日,宗教节日,投票日,哀悼日,公司可能发生的临时休假或政治原因等因素。维护表格成为一个表格重要的任务。检索下一个工作日基本上是查询表MIN(date)
WHERE date > current_date
答案 1 :(得分:1)
一种典型的方法是:
WHERE ( (to_char(sysdate, 'dy') in ('sun', 'mon', 'tue', 'wed', 'thu') and oh.DELIVERY_DATE = TRUNC(SYSDATE) + 1
) or
(to_char(sysdate, 'dy') in ('sat') and oh.DELIVERY_DATE = TRUNC(SYSDATE) + 2
) or
(to_char(sysdate, 'dy') in ('fri') and oh.DELIVERY_DATE = TRUNC(SYSDATE) + 3
)
)
我非常同意另一个答案,即您应该为自己的公司制作日历表。下一个工作日不仅是关于周末,还关于假期。
答案 2 :(得分:1)
如果您只查找工作日,那么一种方法是创建自己的功能,该功能将在下一个工作日返回:
create or replace function calc_date(dt date)
return date as ret date;
begin
SELECT min(dt) into ret from (
SELECT ( dt + 1 ) AS dt FROM DUAL
UNION
SELECT ( dt + 2 ) AS dt FROM DUAL
UNION
SELECT ( dt + 3 ) AS dt FROM DUAL
) t
where TO_CHAR(dt, 'D') not in (1,7);
return ret;
end;
呼叫
select calc_date('2017-09-08') from dual;