Hi,
I have a rule which returns the process duration in interval format.
now()- ri!processStartTime - Given 07/01/2019 1:27 PM as the process start time, it returns
396::00:50:49.264 (which is in day to second format). How do i display this in years, days, hrs, mins?
For eg:
Discussion posts and replies are publicly visible
A while ago I wrote an Expression Rule function that can calculate the gross elapsed seconds from a date/time difference, which can be used for various things including (i assume) what you're looking to do. My only disclaimer is, I don't happen to know whether this is the most efficient way to do this.
a!localVariables( local!days: tointeger(ri!endTime - ri!startTime), local!hours: hour(ri!endTime - ri!startTime), local!minutes: minute(ri!endTime - ri!startTime), local!seconds: second(ri!endTime - ri!startTime), if( local!days = 0, 0, local!days * 24 * 60 * 60 ) + if( local!hours = 0, 0, local!hours * 60 * 60 ) + if( local!minutes = 0, 0, local!minutes * 60 ) + local!seconds )
Here's how I used the above - I was looking for a way to make a grid of tasks show "natural started time" similar to what you see if you view your task list in tempo. I assume you can probably reuse this concept and do some light tweaking to make it do what you're after.
/* display natural time, ie the timestamps that appear on the task list */ a!localVariables( local!elapsedSeconds: rule!TEST_elapsedSeconds( startTime: ri!time, endTime: now() ), local!elapsedMinutes: floor(local!elapsedSeconds / 60), local!elapsedHours: floor(local!elapsedSeconds / 3600), local!weekdayNames: {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}, local!timeDecision: where({ local!elapsedSeconds < 30, local!elapsedSeconds < 60, local!elapsedSeconds < 3600, local!elapsedSeconds < (3600 * 24), local!elapsedSeconds < (3600 * 24 * 2), local!elapsedSeconds < (3600 * 24 * 7), true() /* all other date/times */ }), /*local!elapsedSeconds & char(10) & local!timeDecision & char(10) &*/ choose( local!timeDecision[1], "A moment ago", "Less than a minute ago", local!elapsedMinutes & if(local!elapsedMinutes > 1, " minutes", " minute") &" ago", local!elapsedHours & if(local!elapsedHours > 1, " hours", " hour") &" ago", "Yesterday, " & totime(local(ri!time)), index(local!weekdayNames, weekday((ri!time), 1), "") & ", " & totime(local(ri!time)), todate(local(ri!time)) & ", " & totime(local(ri!time)) ) )
I tried the rule and it gives the following error:
Expression evaluation error: Syntax error. Details: Expression evaluation error: Keyword and non-keyword arguments must not be mixed. Used in: localVariables.
Please post a screenshot of what you're trying.
Here is the test rule i created with the code you provided. I get the error when testing the rule.
Also, when i use within the interface which has the exact code , i get the same error.
Please note that we are in 18.2 version. Thanks again for your help.
Since you're pre-19.2, you need to change a!localVariables() to with() instead. Everything else can stay the same I believe.
I have a simpler version as well that just parses out that duration format, based on a decimal representation of datetime difference, feel free to try it out.
rule!durationFromDecimal()
with( local!interval: tointervalds(ri!duration), local!days: tointeger(split(tostring(local!interval),"::")[1]), local!hours: tointeger(split(tostring(local!interval),":")[3]), local!minutes: tointeger(split(tostring(local!interval),":")[4]), local!seconds: tointeger(split(tostring(local!interval),":")[5]), if( local!days = 0, "", local!days & if(local!days = 1, " day, ", " days, ") ) & if( and(local!days=0, local!hours=0), "", local!hours & if(local!hours = 1," hour, "," hours, ") ) & if( and(local!days = 0, local!hours = 0, local!minutes = 0), "", local!minutes & if(local!minutes = 1," minute, "," minutes, ") ) & local!seconds & if(local!seconds = 1," second"," seconds") )
To test is out:
load( local!date1: now(), local!date2: now(), a!boxLayout( contents: { a!columnsLayout( columns: { a!columnLayout( contents: { a!dateTimeField( label: "Date 1", value: local!date1, saveInto: local!date1 ) } ), a!columnLayout( contents: { a!dateTimeField( label: "Date 2", value: local!date2, saveInto: local!date2 ) } ), a!columnLayout( contents: { a!textField( readOnly: true, label: "Duration", value: rule!durationFromDecimal(local!date2-local!date1) ) } ) } ) } ) )
I was able to convert to what i want from these.
Chris & Mike,
Thanks for your help.