将x个工作日添加到自定义列中的date

我试图在Power Query中添加一个自定义列,如果满足条件,则添加3个工作日 ,否则会添加2个工作日。

我可以有条件地添加几天没有问题,但是有麻烦,而不是添加工作日。 我知道这很容易在Excel中使用=IF X = 1,WORKDAY([REFERENCE],3),WORKDAY([REFERENCE],2)但是我怎样才能做同样的事情作为查询编辑器中的自定义列?

以下是我所拥有的,包括周末在内的几天:

=if [REF]="1" then Date.AddDays([ETA],3) else Date.AddDays([ETA],2)

我写了一个自定义函数来解决这个问题,除非你也需要考虑假期。 这是有点普遍的,它可以与2或200或2000添加天。 Excel中的等于=WORKDAY(date;days)函数。

这里是:

 (startDate, days) => let Step1 = List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), #duration(1,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays Step3 = List.FirstN(Step2, days), //select required number of workdays Output = if days <= 0 then startDate else List.Last(Step3) in Output 

您可以将其保存为查询,将其命名为AddWorkdays ,然后使用如下所示:

 YourStepName = Table.AddColumn(yourTable, "CustomColumnName", each AddWorkdays([ETA], if [REF]="1" then 3 else 2) //note that [REF]="1" filters a text value, not number! 

否则,你可以在你的代码中插入这个函数

 fnAddWorkdays = (startDate, days) => let Step1 = List.Dates(Date.AddDays(startDate, 1), days + Number.RoundUp(days/7*3+4,0), #duration(1,0,0,0)), //provision list of added days with 3 more days per each added week, starting from startDate + 1 day Step2 = List.Select(Step1, (item) => Date.DayOfWeek(item, Day.Monday) < 5), // select only workdays Step3 = List.FirstN(Step2, days), //select required number of workdays Output = if days <= 0 then startDate else List.Last(Step3) in Output, 

一个解决scheme是将其分解成2个组件:

  1. 根据您的初始条件,添加2或3天
  2. 如果在星期六或星期天结束,则再增加2天以跳过周末

您已经执行了第1步。

您现在只需要执行第2步,如果需要,也可以再增加2天。 您可以使用DayOfWeek函数来确定您开始的位置,以确定是否需要额外的2天:

如果您要增加3个工作日,则如果最初一天是星期三,星期四或星期五,则需要再增加2天:

 if Date.DayOfWeek([ETA], Day.Wednesday) <= 2 then {Add 2 more days} 

如果您要添加2个工作日,那么如果最初一天是星期四或星期五,则需要再增加2天:

 if Date.DayOfWeek([ETA], Day.Thursday) <= 1 then {Add 2 more days} 

您可以将这些纳入您的初始声明。