Link to home
Start Free TrialLog in
Avatar of Jeff
JeffFlag for United States of America

asked on

DB2 SQL Convert Packed Decimal to Time with Formatting

LPSDT and LPFDT are date and time stored as Packed Decimal. I am attempting to extract the information out and put it in time format and calculate Time Spent.

select LPEM as "Employee", LPLC as "LaborCode", 
to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as "Start Date/Time",
to_date(char(lpfdt), 'YYYYMMDDHH24MISS') as "Finish Date/Time",
to_date(char(lpfdt), 'YYYYMMDDHH24MISS') - to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as "Time Spent",
from labor.empmngmnt

Open in new window

Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Hi Jeff,

This has the potential to solve just like your previous question.  The packed decimal value is 14 digits.  Convert them to timestamps, and compute the difference with timestampdiff.  It does require a reasonable estimate of what you expect, seconds, days, etc.

select LPEM as "Employee", LPLC as "LaborCode", 
to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as "Start Date/Time",
to_date(char(lpfdt), 'YYYYMMDDHH24MISS') as "Finish Date/Time",
timestampdiff (2, to_date(char(lpfdt), 'YYYYMMDDHH24MISS'), to_date(char(lpsdt), 'YYYYMMDDHH24MISS')) as "Time Spent",
from labor.empmngmnt

Open in new window


That query will return the number of seconds between the two times.  Adding the computed number of seconds to time ('00.00.00') will give you an answer as HH:MM:SS.  If you're expecting an answer of days or more, what format do you need?

Kent
Avatar of Jeff

ASKER

I get an error Number of arguments for function TimeStampDiff not valid...
Sorry.  There are too many kinds of DB2.  :)  Try this one....

select LPEM as "Employee", LPLC as "LaborCode", 
to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as "Start Date/Time",
to_date(char(lpfdt), 'YYYYMMDDHH24MISS') as "Finish Date/Time",
timestampdiff (2, cast (to_date(char(lpfdt), 'YYYYMMDDHH24MISS') -  to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as char(22))) as "Time Spent",
from labor.empmngmnt

Open in new window

Avatar of Jeff

ASKER

Sorry for the absence.

While the code produces the result it either isn't correct or represents a value that I'm not expecting.

For  a Start of 3/19/2017 1:44:23 PM and a Finish of 3/19/2017 2:06:21 PM

timestampdiff (2, cast (to_date(char(lpfdt), 'YYYYMMDDHH24MISS') -  to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as char(22))) as "Time Spent",

results in 13:18

For the same Start and Finish

to_date(char(lpfdt), 'YYYYMMDDHH24MISS') - to_date(char(lpsdt), 'YYYYMMDDHH24MISS') as "Time Spent",

results in 21:58

21:58 is the result that I expect.

Also with both the result comes out as an integer value instead of time. They are 1318 and 2158 instead of 13:18 and 21:58.
ASKER CERTIFIED SOLUTION
Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial