Oracle下一个工作日(周一至周五)?

时间:2017-09-07 09:55:09

标签: sql oracle date oracle10g

我需要在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"

3 个答案:

答案 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;