Tuesday, 28 November 2017

How to calculate time spent or no of days between two day time value ?

Hi All,

This post explains how to  calculate time spent and no of days between two date time value and issue faced while doing same and how to resolve those.

First Try 
Account acc = [select id,createddate,lastmodifieddate from Account limit 1];

datetime diff = acc.lastmodifieddate - acc.createddate;
System.debug('diff --'+diff );

Error - ERROR:COMPILE ERROR: Date/time expressions must use Integer or Double or DecimalLINE: 3 COLUMN: 14


 Second Try 

Account acc = [select id,createddate,lastmodifieddate from Account limit 1];

Integer diff = Integer.valueOf(acc.lastmodifieddate) - Integer.valueOf(acc.createddate);
System.debug('diff --'+diff );

Error
ERROR:EXCEPTION: System.TypeException: Invalid integer: java.util.GregorianCalendar[time=1455789326000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT",offset=0,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=4,ERA=1,YEAR=2016,MONTH=1,WEEK_OF_YEAR=7,WEEK_OF_MONTH=3,DAY_OF_MONTH=18,DAY_OF_YEAR=49,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=9,HOUR_OF_DAY=9,MINUTE=55,SECOND=26,MILLISECOND=0,ZONE_OFFSET=0,DST_OFFSET=0]STACKTRACE: AnonymousBlock: line 3, column 1LINE: 3 COLUMN: 1


Final Try and It works.

Account acc = [select id,createddate,lastmodifieddate from Account limit 1];
long seconds = acc.lastmodifieddate.getTime() - acc.createddate.getTime();
System.debug('seconds --'+seconds);
long millseconds = seconds/1000;
System.debug('millseconds --'+millseconds );
Integer min = Integer.valueof(millseconds/60);
System.debug('min --'+min );
Integer hour = min/60;
System.debug('hour --'+hour);
Integer day = hour/24;
System.debug('day --'+day );

The key note here is use of getTime() method.

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_datetime.htm