在oracle sql中添加工作日
我有两个日期字段,date_FIELD_ONE=8/30/2018和date_FIELD_two=date_FIELD_ONE+20。如果我只增加了20个工作日,我需要找到日期字段2应该是什么。我将如何做到这一点?我想试试“DY”,但不知道如何让它工作。谢谢在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')=
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