Forum Discussion

Ritaf's avatar
Ritaf
Responsive Resident
6 years ago
Solved

NEtwork Days M language

Hi , I have to create KPI's based on sla's of orders management. I want to calculate those SLA's in working days at power Query (Not Dax). I read many purposes to solutions , but didn't succeed in ...
  • Jimmy801's avatar
    Jimmy801
    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
        FinalResult

     

    If this post helps or solves your problem, please mark it as solution.
    Kudos are nice to - thanks
    Have fun

    Jimmy

  • Jimmy801's avatar
    Jimmy801
    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
        FinalResult

    invoke 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

     

  • Jimmy801's avatar
    Jimmy801
    6 years ago

    😪😭

    oooh. .how sad