【问题标题】:Next business day (Monday - Friday) in Oracle?Oracle 的下一个工作日(周一至周五)?
【发布时间】:2018-02-16 00:21:28
【问题描述】:

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

【问题讨论】:

    标签: sql oracle date oracle10g


    【解决方案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 &gt; current_date

    【讨论】:

      【解决方案2】:

      一个典型的方法是:

      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
              )
             )
      

      我非常同意另一个答案,即您应该为您的企业准备一个日历表。下一个工作日不仅是周末,也是假期。

      【讨论】:

      • 除周末和公众假期外,我们全年每天都营业(在这种情况下,不会发货,因此报告将是空白/无论如何都不会生成)。为什么要包括周六和周日,我们需要吗?我们只想把星期五当作星期一,而忽略周末?
      • @user6888062 。 . .我处理数据已经很长时间了,很长时间了。人们认为数据中的内容通常与数据中的真实内容不同。
      【解决方案3】:

      如果您只寻找工作日,那么一种方法是创建您自己的函数,该函数返回下一个工作日:

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 2017-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多