Recently there have been a number of Forum questions on converting time to duration 
Time and duration are not the same - Time can be read from a clock - duration is the accumulation on intervals - and although we use a common terminology  - hours - minutes and seconds they are different 
This example uses a simple data set consisting of project start and end times by employee
Date Functions - (see https://jimdehner2.blogspot.com/2020/02/dates-functions-and-other-necessary.html)
The date functions in Tableau are based on a truncating the date/time structure shown below 
If you needed to determine the number of days between the start and end dates you could use                       
  Datediff('day',[Start date],[End date]) 
 and  the value for project A9 would be -  27
but the actual interval is 27 days 1 hour 1 minute  and 32 minutes 
Increasing the number of decimal places will not change the result - Datediff truncated the value at the 'day' level
So how can we get Tableau to return the actual duration - 
Determining the duration
The solution is to build the duration from the lowest level (grain) in the data - the example here is in seconds - Yours may differ and you can adjust the model as needed - also we will want to be able to calculate the duration at different levels in the data - this LOD will meet that need
{ INCLUDE [Employee],[Project]:sum( DATEDIFF('second',[Start Date],[End Date])  )}
The LOD will return the difference in seconds - 
The duration are large and not what you want. They need to be converted to hours, minutes, and seconds 
sum({ INCLUDE  [Employee],[Project]:sum([datediff at the second LOD]%60)})%60
Again using an LOD to allow summing at different levels in the data -  Note the use of MODULO     -  the function returns the remainder of the measure (here the total seconds)  divided by the value that follows the % sign (60)   - the LOD will first sum the remaining seconds at the level of the viz - the second use of modulo converts the total to minutes and seconds during the accumulation across the employee level and above.
The Duration in Minutes is 
int(sum({ INCLUDE [Employee],[Project]:sum([datediff at the second LOD])/60 }) %60)
The Int() or Floor() will returns the integer portion of the calculation rounded down 
The Duration in Days is
int(sum({ INCLUDE [Employee],[Project]:sum([datediff at the second LOD])  }) / (60*60*24))
In text table form the viz is
Format dd:hh:mm:ss
Often users have asked to have a format similar to dd:hh:mm:ss
str([duration days])+":" +str([duration hours])+":" +str([duration minutes])+":" +str([duration - seconds]  )
The formula leverages the integer value in  the LOD (integer) values and converting them to strings 
and returns this in summary 
Time and duration are not the same and it does take a few steps to getthe actual duration in a format the user expects - Hope this helps the next time you are faced with a similar problem
The workbook used in these examples can be found at      
Enjoy
Jim 

No comments:
Post a Comment
Note: Only a member of this blog may post a comment.