Forum Discussion
NEtwork Days M language
- 6 years ago
Hello
I tried to speed up my version. so if you have no performance issue with this solution, I would go for it.
This solution is slower af the other proposed Anonymous . But if we come to include holiday it's faster
// fnNetWorkDays (DateStart as date, DateEnd as date, optional Holidays as list) => let Switch = DateStart > DateEnd, StartDate = if Switch then DateEnd else DateStart, EndDate = if Switch then DateStart else DateEnd, WeekDaysInRange= ( Duration.TotalDays ( ( EndDate- ( StartDate +Duration.From ( Date.DayOfWeek ( EndDate ) -Date.DayOfWeek ( StartDate ) ) ) ) ) /7*5 ) +Date.DayOfWeek ( EndDate ) -Date.DayOfWeek ( StartDate ) +1 + ( if Date.DayOfWeek ( StartDate )=0 then -1 else 0 ) + ( if Date.DayOfWeek ( EndDate )=6 then -1 else 0 ), HolidaysInRange = if Holidays = null then {} else List.Select(Holidays, each StartDate <= _ and _ <= EndDate and Date.DayOfWeek(_, Day.Monday) <5 ), Result = (if Switch then -1 else 1) * ((WeekDaysInRange) - List.Count(HolidaysInRange)) in Result // fnNetWorkDays2 (DateStart as date, DateEnd as date, optional Holidays as list) => let Switch = DateStart > DateEnd, StartDate = if Switch then DateEnd else DateStart, EndDate = if Switch then DateStart else DateEnd, HolidayIntern = if Holidays = null then List.Buffer({}) else List.Buffer(Holidays), CreateListDates =List.Buffer( List.Dates ( StartDate, Duration.TotalDays ( EndDate - StartDate ) +1, #duration(1,0,0,0) )), ExcludeWeekend = List.Select ( CreateListDates, each Date.DayOfWeek ( _, Day.Monday ) <5 ), ExcludeHoliday = if Holidays = null then ExcludeWeekend else List.Difference ( ExcludeWeekend, HolidayIntern ), Result = List.Count ( ExcludeHoliday ), FinalResult = try (if Switch then -1 else 1) * (Result) otherwise null in FinalResultIf this post helps or solves your problem, please mark it as solution.
Kudos are nice to - thanks
Have fun
Jimmy - 6 years ago
Hey
I was just now that i posted both version.. and this confused you 🙂 sorry 🙂
// fnNetWorkDays2 (DateStart as date, DateEnd as date, optional Holidays as list) => let Switch = DateStart > DateEnd, StartDate = if Switch then DateEnd else DateStart, EndDate = if Switch then DateStart else DateEnd, HolidayIntern = if Holidays = null then List.Buffer({}) else List.Buffer(Holidays), CreateListDates =List.Buffer( List.Dates ( StartDate, Duration.TotalDays ( EndDate - StartDate ) +1, #duration(1,0,0,0) )), ExcludeWeekend = List.Select ( CreateListDates, each Date.DayOfWeek ( _, Day.Monday ) <5 ), ExcludeHoliday = if Holidays = null then ExcludeWeekend else List.Difference ( ExcludeWeekend, HolidayIntern ), Result = List.Count ( ExcludeHoliday ), FinalResult = try (if Switch then -1 else 1) * (Result) otherwise null in FinalResultinvoke it like this
=try fn([Start],[End]) otherwise null
If this post helps or solves your problem, please mark it as solution.
Kudos are nice to - thanks
Have fun
Jimmy - 6 years ago
😪ğŸ˜
oooh. .how sad
Hello Ritaf
I understand what exactly you need.. what are sla? What do you want to calculate exactly?
If you could provide some data example with the desired output with a detailed description of it or the final goal would help and be appreciated.
by the way is a Power-BI-file saved as .xlsx
Have a nice time
Jimmy
- Ritaf6 years agoResponsive Resident
Hi Jimmy,
I just want to calculate a difference bertween 2 dates without weekends snd/ or holidays , for this cse study i not matter which, i just need to understend the code. And thank you for your paying attention i put a pbix file.