[已解决] power query根据起始日和工作日天数计算结束日期

  [复制链接]
查看220574 | 回复170 | 2020-12-18 05:59:29 | 显示全部楼层 |阅读模式
求助大神,如何用power query计算工作的结束日期!

已知起始日期为2018-08-01,经历3个工作日后为2018-08-06,如何用power query实现这样的计算结果?谢谢!
回复

使用道具 举报

没没 | 2020-12-18 06:07:29 | 显示全部楼层
你的意思是讲,如果当天的三天后是周六或是周天就顺延至最近的下一个工作日对不对?如果是这样的话,先由当前日期生成所在周周末的日期,然后两个日期相减确定出差值。差值为3的就是加4天,差值为四的就是加5天。用到的函数为Date.AddDays() 希望能帮到你
回复

使用道具 举报

维维 | 2020-12-18 06:11:30 | 显示全部楼层
或者也不用求周末日期 直接转换出当天的是星期几的话 按条件加相应天数,周三就加五 周四就加四 其他加三 更便捷一些
回复

使用道具 举报

lzswzbs | 2020-12-18 06:14:30 | 显示全部楼层
或者不用求周末日期 直接转换出日期是周几也行 周三加五 周四加四 其余加三 更便捷
回复

使用道具 举报

ykscan | 2020-12-18 06:23:30 | 显示全部楼层
如果不考虑法定假日和周末调班的那种,比如国庆节七天调休那样的情况。只跳过周末双休,可以试试这几个。我从畅心大神那里学来的。
1、迭代
  1. = let fx=(x,y)=>List.Accumulate({1..y},x,(s,c)=>Date.AddDays(s,List.Max({1,3-Date.DayOfWeek(s,5)})))

  2. in fx(#date(2018,8,1),3)
复制代码
2、递归
  1. = let fx=(x,y)=>if y=0 then x else @fx(Date.AddDays(x,1),y-Byte.From(Date.DayOfWeek(x,5)>1))

  2. in fx(#date(2018,8,1),3)
复制代码
3、序列构造,依据星期几找规律
  1. = let fx=(x as date,y as number)=>

  2.              Date.AddDays( x,

  3.                    List.Skip( List.Alternate( {1..21},

  4.                            2,

  5.                            5,

  6.                            6-Date.DayOfWeek(x,6)

  7.                            ),

  8.                        Byte.From(Date.DayOfWeek(x,0)=6) ){y-1} )

  9. in fx(#date(2018,8,1),3)
复制代码
如果考虑中国式放假,周末调班的算工作日,法定假日不算工作日。那事先要做一个假日表和调班表
  1. let

  2.   假日 = Table.TransformColumns(Excel.CurrentWorkbook(){[Name="假日"]}[Content],{},Date.From)[假日],//制作某年度内的法定假日表



  3.   调班 = Table.TransformColumns(Excel.CurrentWorkbook(){[Name="调班"]}[Content],{},Date.From)[调班], //制作某年度内的周末调班表

  4.   

  5.   Date.AfterWorkDays = let

  6.          fx=(x,y)=>

  7.              if y=0

  8.              then x

  9.              else @fx( Date.AddDays(x,1),

  10.                  y-( if List.Contains(调班,Date.AddDays(x,1)) then 1 else

  11.                  if List.Contains(假日,Date.AddDays(x,1)) then 0 else

  12. Byte.From(Date.DayOfWeek(x,5)>1) ) )

  13.         in fx,



  14.   test = Date.AfterWorkDays(#date(2018,9,27),3)

  15. in

  16.   test
复制代码
回复

使用道具 举报

游大海 | 2020-12-18 06:24:30 | 显示全部楼层
假日
2017/12/30
2017/12/31
2018/1/1
2018/2/15
2018/2/16
2018/2/17
2018/2/18
2018/2/19
2018/2/20
2018/2/21
2018/4/5
2018/4/6
2018/4/7
2018/4/29
2018/4/30
2018/5/1
2018/6/16
2018/6/17
2018/6/18
2018/9/22
2018/9/23
2018/9/24
2018/10/1
2018/10/2
2018/10/3
2018/10/4
2018/10/5
2018/10/6
2018/10/7

调班
2018/2/11
2018/2/24
2018/4/8
2018/4/28
2018/9/29
2018/9/30
回复

使用道具 举报

砍菠萝 | 2020-12-18 06:29:31 | 显示全部楼层
如果不考虑法定假日和周末调班的那种,比如国庆节七天调休那样的情况。只跳过周末双休,可以试试这几个。我 ...


太感谢了!
回复

使用道具 举报

se11989009 | 2020-12-18 06:37:31 | 显示全部楼层
如果不考虑法定假日和周末调班的那种,比如国庆节七天调休那样的情况。只跳过周末双休,可以试试这几个。我 ...


太详细了,赞
回复

使用道具 举报

白泉颐 | 2020-12-18 06:40:31 | 显示全部楼层
感谢分享,赞
回复

使用道具 举报

dajun | 2020-12-18 06:45:31 | 显示全部楼层
2种解决方案,一种通过计算日期的函数进行加一天,例如用到Date.AddDays,另一种方式就是把数字1改成持续时间格式,就会用到Duration.From这个函数。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则