I am trying to calculate duration given two timestamps. When I subtract the two, it appears the subtraction is happening with minute-level granularity (i.e. the seconds are being ignored). Is this the correct subtraction functionality?
Here's a comparison I have done trying to subtract various time intervals...
a!localVariables( local!epsilon: 0.0000115740740740741, /* one second */ local!times: { { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:00 AM", expected: 0 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:01 AM", expected: local!epsilon }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:10 AM", expected: local!epsilon * 10 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:30 AM", expected: local!epsilon * 30 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:50 AM", expected: local!epsilon * 50 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:59 AM", expected: local!epsilon * 59 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:00:59.999 AM", expected: local!epsilon * 59.999 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:01:00 AM", expected: local!epsilon * 60 * 1 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:01:30 AM", expected: local!epsilon * 60 * 1.5 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:02:00 AM", expected: local!epsilon * 60 * 2 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:04:00 AM", expected: local!epsilon * 60 * 4 }, { start: "1/1/2000 8:00:00 AM", end: "1/1/2000 8:08:00 AM", expected: local!epsilon * 60 * 8 } }, a!forEach( items: local!times, expression: a!localVariables( local!actual: toDateTime(fv!item.end) - toDateTime(fv!item.start), local!actualNumeric: todecimal(local!actual), { expected: tointervalds(fv!item.expected), actual: local!actual, nearlySame: abs(local!actualNumeric - todecimal(fv!item.expected)) < local!epsilon } ) ) )
All of these should result in nearlySame being true. But only the ones that are quantized to the minute boundary end up being true.
Discussion posts and replies are publicly visible
This feels more like your are running into some rounding, numeric precision and number conversation issues somewhere.
Appian seems not to like working with seconds in the first place (i.e. it will not display seconds by default). It appears that toDateTime is ignoring the seconds.
{ start: toDateTime(fv!item.start), end: toDateTime(fv!item.end), expected: tointervalds(fv!item.expected), actual: local!actual, nearlySame: abs(local!actualNumeric - todecimal(fv!item.expected)) < local!epsilon }
For what should be a 30 second interval, the output is this
looking at it with Expression view....{start: fn!todatetime(fn!datetime(2000, 1, 1, 8, 0, 0, 0)), end: fn!todatetime(fn!datetime(2000, 1, 1, 8, 0, 0, 0)), expected: fn!internalize("0000000100000028000000000000000300000002000000003F36C16C16C16C25000000010000001D0000000100000002"), actual: fn!internalize("0000000100000028000000000000000300000002000000000000000000000000000000010000001D0000000100000002"), nearlySame: false},
You can see in the end timestamp the seconds are already truncated. This value comes from toDateTime("1/1/2000 8:00:30 AM").
So is toDateTIme broken? Should it be ignoring seconds?
The subtraction works when it has the seconds...
The problem is the seconds are not considered when the string is converted to a DateTime. It is not a problem with toDateTime.... This looks more like a parser error.... when Appian interprets the string to convert it to the original dateTime() command.
Conversions between strings and dates/number are always problematic.
But, out of curiosity, what are you looking for?
Was planning on calculating total time spent on a task (from task creation to completion). Task End - Task Start.
However, i'm checking the process report and I don't actually see a task end timestamp.... only the start timestamp.
Task reports already provide this number. Check out the task metric functions in process reports.
Will do. Thanks.