Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在oracle sql中添加工作日_Sql_Oracle - Fatal编程技术网

在oracle sql中添加工作日

在oracle sql中添加工作日,sql,oracle,Sql,Oracle,我有两个日期字段,date_FIELD_ONE=8/30/2018和date_FIELD_two=date_FIELD_ONE+20。如果我只增加了20个工作日,我需要找到日期字段2应该是什么。我将如何做到这一点?我想试试“DY”,但不知道如何让它工作。谢谢 CASE WHEN TO_CHAR(TO_DATE(DATE_FIELD_ONE),'DY')='SAT' THEN 1 ELSE 0 END CASE WHEN TO_CHAR(TO_DATE(DATE_FIELD_ONE),'DY')=

我有两个日期字段,date_FIELD_ONE=8/30/2018和date_FIELD_two=date_FIELD_ONE+20。如果我只增加了20个工作日,我需要找到日期字段2应该是什么。我将如何做到这一点?我想试试“DY”,但不知道如何让它工作。谢谢

CASE WHEN TO_CHAR(TO_DATE(DATE_FIELD_ONE),'DY')='SAT' THEN 1 ELSE 0 END
CASE WHEN TO_CHAR(TO_DATE(DATE_FIELD_ONE),'DY')='SUN' THEN 1 ELSE 0 END
你可以试试这个:

select max(date_field_two) as date_field_two
  from
 (
 select date'2018-08-30'+  
    cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH') 
                                              in ('6','7') then 
            0
          else
            level
          end as int) as date_field_two, 
 sum(cast(case when to_char(date'2018-08-30'+level,'D','NLS_DATE_LANGUAGE=ENGLISH')  
                                               in ('6','7') then 
            0
          else
            1
          end as int)) over (order by level) as next_day
      from dual
    connect by level <= 20*1.5 
-- 20 is the day to be added, every time 5(#of business days)*1.5 > 7(#of week days)
-- 7=5+2<5+(5/2)=5*(1+1/2)=5*1.5 [where 1.5 is just a coefficient might be replaced a greater one like 2]
-- so 4*5*1.5=20*1.5 > 4*7 
  )    
 where next_day = 20;

 DATE_FIELD_TWO
-----------------
   27.09.2018

它会在下一天迭代,如本例所示,除非这个假日与周末重合。

如果使用PL/SQL函数,您可以将工作日定义为任何您喜欢的时间

这里有一个简单的原型——没有任何假期——但它可以使用相同的逻辑进行调整

create or replace function add_business_days (from_date IN date, bd IN integer) return date as 
  fd date := trunc(from_date,'iw'); 
  cnt int := (from_date-fd)+bd-1; 
  ww int := ceil(cnt/5); 
  wd int := mod(cnt,5); 
begin
  return from_date + (ww*7)+wd; 
end;
/

我知道你已经有了答案,但值得一提的是,这是我们一直在处理的事情,并且有一个非常好的解决方案

实际上,我们维护了一个名为“工作日”的单独表,该表包含了我们可以比较的每个可能的日期(当然,该定义因应用程序而异——但无论如何,按照RDBMS标准,它永远不会是“巨大的”)。有一个布尔标志指示日期是工作日还是周末/假日,但更重要的是,有一个仅在工作日递增的索引值。该表如下所示:

这样做的好处是透明性和可伸缩性。如果要计算工作日中两个日期之间的差异:

select
  h.entry_date, h.invoice_date, wd2.workday_index - wd1.workday_index as delta
from
  sales_order_data h
  join util.work_days wd1 on h.sales_order_entry_dte = wd1.cal_date
  join util.work_days wd2 on h.invoice_dte = wd2.cal_date
如果您需要在表格中记录日期并添加20天(如您最初的问题陈述):

(免责声明,这是在PostgreSQL中,这就是我使用布尔值的原因。在Oracle中,我猜您需要将其更改为整数,并说
=1

另外,对于奖金问题,这也给出了两个不同的定义“工作日”的选项,一个向前滚动,另一个向后滚动(因此是workday_指数和workday_指数)。例如,如果你在周六需要一些东西,而周六不是工作日,那就意味着你在周五需要它。相反,如果某件东西要在周六交付,而周六不是工作日,那么这意味着它将在周一可用。如何处理非工作日的上下文不同,此方法为您提供了选择正确的方法的选项


作为最后一个卖点,此选项还允许您将假日定义为非工作日。。。你可以这样做,也可以不这样做;这取决于你。这个解决方案允许任何一种选择。理论上,你可以为工作日指数周末增加两列,但这两列都给你提供了选择。

公共假期呢?可能是你如何得出1.5的重复?@smattiko84
7=5+2如果我真的想增加几个美国假期,我该如何修改?
select
  h.entry_date, h.invoice_date, wd2.workday_index - wd1.workday_index as delta
from
  sales_order_data h
  join util.work_days wd1 on h.sales_order_entry_dte = wd1.cal_date
  join util.work_days wd2 on h.invoice_dte = wd2.cal_date
select
  h.date_field_1, wd2.cal_date as date_field_1_plus_20
from
  my_table h
  join util.work_days wd1 on h.date_field_1 = wd1.cal_date
  join util.work_days wd2 on
    wd1.workday_index + 20 = wd2.workday_index and
    wd2.is_workday