Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
7 years ago
Solved

Calculating Network Hours / Working Hours

Hello,   I have been trying to calculate Network hours(i.e. working time exculding non business hours, weekends, and holidays). I have tried some other solutions(listed below). However, my dataset ...
  • Anonymous's avatar
    Anonymous
    7 years ago

    Anonymous -

     

    Here's the date table that is referenced in the Calculated Column. Notice, it has a Weekend attribute to indicate whether it's a weekend. You could add OffDay, which considers both weekends and holidays.

    Date = ADDCOLUMNS(CALENDAR(DATE(2018,1,1),DATE(2020,12,31)),"Weekend",IF(WEEKDAY([Date]) IN {1,7}, TRUE(),FALSE()))

     

    Here's a Calculated Column. It works with weekends. The same logic could be used with Is OffDay instead of Weekend. You'd replace the following bits: 

    var start_date_is_weekend = LOOKUPVALUE('Date'[Weekend],'Date'[Date],INT([Date/Time Opened]))

    var end_date_is_weekend = LOOKUPVALUE('Date'[Weekend],'Date'[Date],INT([Date/Time Closed]))

    'Date'[Weekend] = FALSE()

     

    Hours Difference = 
    //Define hours of workday, in seconds
    var work_day_begins = 3600 * 9 //9AM
    var work_day_ends = 3600 * 17  //5PM
    var seconds_in_workday = work_day_ends - work_day_begins
    
    //Check whether start/end dates occurred on a weekend.
    var start_date_is_weekend = LOOKUPVALUE('Date'[Weekend],'Date'[Date],INT([Date/Time Opened]))
    var end_date_is_weekend = LOOKUPVALUE('Date'[Weekend],'Date'[Date],INT([Date/Time Closed]))
    
    //Get the seconds from midnight. 
    //If it's a weekend, always use the end of the workday value.
    //If outside working hours, snap to the start or end of day.
    var start_time = TIMEVALUE(FORMAT([Date/Time Opened],"HH:mm:ss"))*86400
    var end_time = TIMEVALUE(FORMAT([Date/Time Closed],"HH:mm:ss"))*86400
    var start_time_adj = IF(start_date_is_weekend,work_day_ends,MIN(MAX(start_time,work_day_begins),work_day_ends))
    var end_time_adj = SWITCH(
        TRUE(),
        ISBLANK(end_date_is_weekend),BLANK(),
        end_date_is_weekend,work_day_ends,
        MIN(MAX(end_time,work_day_begins),work_day_ends)
    )
    
    //Find the number of workdays
    var day_diff = COUNTROWS(
        FILTER(
            'Date',
            [Date] > INT([Date/Time Opened]) 
            && [Date] <= INT([Date/Time Closed]) 
            && 'Date'[Weekend] = FALSE()
        )
    )
    
    //Final calculation:
    var time_diff = end_time_adj - start_time_adj
    var working_seconds = (day_diff * seconds_in_workday) + time_diff
    var working_hours = working_seconds / 3600.00
    return IF(ISBLANK([Date/Time Closed]),BLANK(),working_hours)