如果不考虑法定假日和周末调班的那种,比如国庆节七天调休那样的情况。只跳过周末双休,可以试试这几个。我从畅心大神那里学来的。
1、迭代
- = let fx=(x,y)=>List.Accumulate({1..y},x,(s,c)=>Date.AddDays(s,List.Max({1,3-Date.DayOfWeek(s,5)})))
in fx(#date(2018,8,1),3)
复制代码 2、递归
- = let fx=(x,y)=>if y=0 then x else @fx(Date.AddDays(x,1),y-Byte.From(Date.DayOfWeek(x,5)>1))
in fx(#date(2018,8,1),3)
复制代码 3、序列构造,依据星期几找规律
- = let fx=(x as date,y as number)=>
Date.AddDays( x,
List.Skip( List.Alternate( {1..21},
2,
5,
6-Date.DayOfWeek(x,6)
),
Byte.From(Date.DayOfWeek(x,0)=6) ){y-1} )
in fx(#date(2018,8,1),3)
复制代码 如果考虑中国式放假,周末调班的算工作日,法定假日不算工作日。那事先要做一个假日表和调班表
- let
假日 = Table.TransformColumns(Excel.CurrentWorkbook(){[Name="假日"]}[Content],{},Date.From)[假日],//制作某年度内的法定假日表
调班 = Table.TransformColumns(Excel.CurrentWorkbook(){[Name="调班"]}[Content],{},Date.From)[调班], //制作某年度内的周末调班表
Date.AfterWorkDays = let
fx=(x,y)=>
if y=0
then x
else @fx( Date.AddDays(x,1),
y-( if List.Contains(调班,Date.AddDays(x,1)) then 1 else
if List.Contains(假日,Date.AddDays(x,1)) then 0 else
Byte.From(Date.DayOfWeek(x,5)>1) ) )
in fx,
test = Date.AfterWorkDays(#date(2018,9,27),3)
in
test
复制代码 |