Qlik Community

QlikView Documents

Documents for QlikView related information.

Announcements
Leverage your QlikView investment to modernize BI – see how! Join Group

Working Hours Calculation excluding weekends and holidays

MVP
MVP

Working Hours Calculation excluding weekends and holidays

Working hours calculation is essential measure which is useful in many business cases.  In this post I am going to demonstrate the steps to calculate this measure.  I have also covered other aspects related to working hours like overtime hours and excluding lunch break hours.  

Example in this post works for weekends as Saturday and Sunday. If you have any other weekends then refer to my below post

Working-days-and-hours-calculations-for-custom-weekends

Consider the below case

Let's say one Ticket is logged into the system on certain day , call it as Start Date, and the same Ticket got resolved on certain day, call it as End Day. Now we may want to calculate the working hours between these two Dates to calculate the efficiency of ticket closure time.

1) Calculate business working hours excluding week ends(Saturday and Sunday) and Holidays.

Below are the considerations

1) Count only standard working hours ( 9 AM - 6 PM)

2) Exclude Saturdays and Sundays

3) Exclude Holidays

Below is the Setup in QlikView

You can change the Date format of the below variables as per your convenience eg. 'DD/MM/YYYY hh:mm:ss' to 'DD-MMM-YYYY hh:mm:ss'

SET TimeFormat='hh:mm:ss';
SET DateFormat='DD/MM/YYYY';

SET TimestampFormat='DD/MM/YYYY hh:mm:ss';

First, convert your Timestamp date format to 24 hour format using the below functions

a) Timestamp# ()    (if your Timestamp values are text) 

b) TimeStamp ()     (If your Timestamp values are in proper Timestamp format)

Now you can setup the below variables for standard working hours in weekdays.You can change the Variable according to your working hours (Here 9 AM - 6 PM) and rest calculation will be done automatically

Now Setup the Holiday list as below. You can use your own holiday list

Below is the logic to calculate the business working hours between to dates

Here is the output

 

2) Calculate business working hours excluding week ends(Saturday and Sunday), Lunch Breaks and Holidays.

Below are the considerations

1) Count only standard working hours ( 9 AM - 6 PM)

2) Exclude Saturdays and Sundays

3) Exclude Lunch Break (1 PM - 2PM)

4) Exclude Holidays

Set the Variables for standard working hours and lunch breaks. You can change the values according to your needs

Include the Holidays

Below is the logic to calculate the business working hours between two dates

 

 

Here is the output

 

If you want to present the working hours in hh:mm:ss format then you can use below logic after calculating working hours

=interval(Working_Hours/24,'hh:mm:ss')

Please see the attached QVW.

Feel free to provide any suggestions.

Attachments
Comments
Explorer
Explorer

I would like to thank kush141087‌ for the remarkable post with all these information. It is very rich and helped me a lot!

I just need a little help to understand what *24, 0.001 is doing.

The main structure of the script is like:


rangesum(

    round(

          rangesum(

          )*24, 0.001

    )

) AS Business_Hrs_Without_Overtime


I still can't understand why *24 and 0.001 are necessary and how they work along the rest of the script.

Besides, I would like to call on for some more help about the output from the outer rangesum().

What I've understood about the whole post is how "...to calculate the business working hours between two Dates".


I've came across throught some not so easy to catch on results while running the script. For example, I have two dates:

START_TIME = 23/10/2018 09:18

END_TIME = 23/10/2018 09:24

If I use these two dates on the Script, the outer rangersum() (Business_Hrs_Without_Overtime) gives me 0,11 as output.

I just don't know what I should do with this output to get, or even transform to, an Hour that make sense with the whole scope. I mean, the main ideia is to get the business working hour between two given timestamps, right? But the output from this outer rangersum() is a simple number.


If I take this number and cast a Date(), Timestamp() or Time() the result is just some random date and time.


Example:

   

    START_TIME = 23/10/2018 09:18

    END_TIME = 23/10/2018 09:24

    Business_Hrs_Without_Overtime = 0,11


    Timestamp(Business_Hrs_Without_Overtime) = 30/12/1899 02:38:24


Can someone help me understand how to take Business_Hrs_Without_Overtime output and transform into a correct Time?


I'll be really appreciate.

Thanks, friends.

0 Likes

Good work Kushal,

Regards,
Anand

0 Likes
Contributor
Contributor

If my holidays are going to vary from branch to branch or region to region, how it can be incorporated in the above logic.

0 Likes
Contributor II
Contributor II

Good job. Its very useful ....Thanks

0 Likes
Contributor
Contributor

Hallo, I am new in Qlik Sense. I have one question...

How to "convert" the Minutes? for example in you first table on line 5 is "7.98" how can i get the exact minutes of 98? or also in the first table the last line 16.5 how can i get 16:30?

 

Thank you!

0 Likes
Contributor III
Contributor III

Hello Kush,

 

Very interesting but 'overtime' seems not to work when we only have working hours outside of office hours.

working hours : 9-14 15-19

Example : start date 08:00:00 end date 08:39:00

Overtime should be 00:39:00 and your formula shows something else

please see this post for more details

https://community.qlik.com/t5/New-to-QlikView/working-hours-and-overtime/td-p/1626174

 

Thank you !

0 Likes
Contributor
Contributor

Just a question in terms of the loading of dates from different tables

When the StartTime and EndTime load from the same table the script works perfectly. I have the StartTime and Endtime in two different tables. The StartTime loads  but the EndTime doesn't , error message : Field 'EndTime' not found. Does this script only work when loading from one table?

LOAD *,
timestamp(timestamp#(StartTime,'MM/DD/YYYY hh:mm:ss TT')) as START_TIME,
timestamp(timestamp#(EndTime,'MM/DD/YYYY hh:mm:ss TT')) as END_TIME;

Load*,
Timestamp(Timestamp#([StartTime], 'YYYY-MM-DD hh:mm:ss TT') ) AS [StartTime]
FROM [lib://QS/FinancialTransaction.qvd](qvd);

Load*,
Timestamp(Timestamp#([EndTime], 'YYYY-MM-DD hh:mm:ss TT') ) AS [EndTime]
FROM [lib://QS/VendorJob.qvd](qvd); 

Thanks

Have a good day!

0 Likes
Partner
Partner

@Kush  @Sunny 

Hi Kush,

can you please help me to calculating the time diff between two dates based on given points

1- First I have to calculate the time weekdays in between 7 Am to 11 PM excluding sat and sun . am using below script for this but prob is that when both the dates are weekend then its also calculate the time diff  .

if(not WildMatch(IssueStatus,'Pending') , (Interval((RangeMin(frac(IssueResolutionDate), MakeTime(23))- RangeMax(frac(IssueCreateDate), MakeTime(7)))+
( NetWorkDays(IssueCreateDate, IssueResolutionDate-1) * MakeTime(16)) ))) as TotalTime,

2- Second I have to calculate the time diff only Weekend Sat or Sun in between 10 Am to 4 PM . also if any dates is weekend and other one is weekday then it calculate the time based on diff time difference .

3- if any ticket open in the last month and closed in next month then it calculate the time as point 1 except if it comes on weekdays .

Please help me to find the correct result 

 

0 Likes
Specialist
Specialist

How to proceed if I have vStartHour=5, vEndHour=2 ?

0 Likes
Version history
Revision #:
4 of 4
Last update:
4 weeks ago
Updated by:
 
Contributors