Calculate Duration field(in days, hours, minutes,seconds)

Akhil Nair1
Tera Expert

Hi All, 

I have requirement where I have to calculate duration field (in days, hours, minutes,seconds)based on schedule(9-5, everyday). My script is not working and is given below :

durationUpdate();

function durationUpdate(){

var task = new GlideRecord('pm_project_task');
task.addEncodedQuery('sys_id=0d785fda916c5f00e485d6e0f11a9341');
task.query();
if(task.next()){
task.duration = elapsedDuration(task.start_date,task.end_date));
task.setWorkflow(false);
task.update();
}
}

function elapsedDuration(start,end){

var dc = new DurationCalculator();
dc.setSchedule('2efed6b8ec7e320056e1cc120a57cc1e'); //9-5 Schedule sys_id
var dur = dc.calcScheduleDuration(start, end);
var durationMS = dur*1000;
var result = new GlideDuration(dur);
return result;

}

This is giving me output in hours, minutes not in days,hours,minutes as desired

Can someone guide/help me here?

 

 

1 ACCEPTED SOLUTION

Hi Vidya,

This script worked for me 

test();

function test() {

var gr = new GlideRecord('task');
gr.addEncodedQuery('');
gr.query();
while (gr.next()) {
var schedule = new GlideSchedule();
schedule.load('2efed6b8ec7e320056e1cc120a57cc1e'); // my schedule sys_id
var resolveDuration = schedule.duration(gr.start_date.getGlideObject(), gr.end_date.getGlideObject());
gr.duration = outputScheduleDuration(resolveDuration).getDurationValue();
gr.setWorkflow(false);
gr.update();

}
}

function outputScheduleDuration(input_dur) {


var tag = false;
var add_day = 0;
var new_day = 0;
var new_hour = 0;
var new_minute = 0;
var dayLength = 8; // number of hours calculated as 1 day as per my schedule
var oneDay = (1 * dayLength * 60 * 60) * 1000;
var oneHour = (60 * 60) * 1000;
var oneMinute = 60 * 1000;
var value_calc = 0;
var timems = input_dur.getNumericValue();

if (timems > oneDay) {

value_calc = timems / oneDay;
new_day = parseInt(value_calc);
value_calc = (value_calc - new_day);
value_calc = value_calc * 8;

} else {
if (timems > oneHour) {

value_calc = timems / oneHour;

} else {
new_minute = timems / oneMinute;
tag = true;
}


}


if (!tag) {


new_hour = parseInt(value_calc);
value_calc = (value_calc - new_hour);
add_day = parseInt(new_hour / 8);
new_hour = new_hour - (add_day * 8);
new_day = new_day + add_day;
value_calc = value_calc * 60;
new_minute = parseInt(value_calc);


}

value_calc = ((new_day * (24 * 60 * 60 * 1000)) + (new_hour * (60 * 60 * 1000)) + (new_minute * (60 * 1000)));


var final_dur = input_dur;
final_dur.setNumericValue(value_calc);
return final_dur;

}

View solution in original post

4 REPLIES 4

Vidya Lakshmi
Kilo Sage
Kilo Sage

Hi,

Were you able to find a solution for this. Please let me know.

Hi Vidya,

This script worked for me 

test();

function test() {

var gr = new GlideRecord('task');
gr.addEncodedQuery('');
gr.query();
while (gr.next()) {
var schedule = new GlideSchedule();
schedule.load('2efed6b8ec7e320056e1cc120a57cc1e'); // my schedule sys_id
var resolveDuration = schedule.duration(gr.start_date.getGlideObject(), gr.end_date.getGlideObject());
gr.duration = outputScheduleDuration(resolveDuration).getDurationValue();
gr.setWorkflow(false);
gr.update();

}
}

function outputScheduleDuration(input_dur) {


var tag = false;
var add_day = 0;
var new_day = 0;
var new_hour = 0;
var new_minute = 0;
var dayLength = 8; // number of hours calculated as 1 day as per my schedule
var oneDay = (1 * dayLength * 60 * 60) * 1000;
var oneHour = (60 * 60) * 1000;
var oneMinute = 60 * 1000;
var value_calc = 0;
var timems = input_dur.getNumericValue();

if (timems > oneDay) {

value_calc = timems / oneDay;
new_day = parseInt(value_calc);
value_calc = (value_calc - new_day);
value_calc = value_calc * 8;

} else {
if (timems > oneHour) {

value_calc = timems / oneHour;

} else {
new_minute = timems / oneMinute;
tag = true;
}


}


if (!tag) {


new_hour = parseInt(value_calc);
value_calc = (value_calc - new_hour);
add_day = parseInt(new_hour / 8);
new_hour = new_hour - (add_day * 8);
new_day = new_day + add_day;
value_calc = value_calc * 60;
new_minute = parseInt(value_calc);


}

value_calc = ((new_day * (24 * 60 * 60 * 1000)) + (new_hour * (60 * 60 * 1000)) + (new_minute * (60 * 1000)));


var final_dur = input_dur;
final_dur.setNumericValue(value_calc);
return final_dur;

}

AnirudhKumar
Mega Sage
Mega Sage

Use below sample script:

var result = new GlideDuration();
result.setValue(durationMS);
gs.print(result.getDisplayValue()); // get display value - 34 Days 18 Hours 5 Minutes
gs.print(result.getByFormat("HH:mm:ss")); // get hour , minute & s- 18:05:06

Hi Anirudh,

This script worked for me 

test();

function test() {

var gr = new GlideRecord('task');
gr.addEncodedQuery('');
gr.query();
while (gr.next()) {
var schedule = new GlideSchedule();
schedule.load('2efed6b8ec7e320056e1cc120a57cc1e'); // my schedule sys_id
var resolveDuration = schedule.duration(gr.start_date.getGlideObject(), gr.end_date.getGlideObject());
gr.duration = outputScheduleDuration(resolveDuration).getDurationValue();
gr.setWorkflow(false);
gr.update();

}
}

function outputScheduleDuration(input_dur) {


var tag = false;
var add_day = 0;
var new_day = 0;
var new_hour = 0;
var new_minute = 0;
var dayLength = 8; // number of hours calculated as 1 day as per my schedule
var oneDay = (1 * dayLength * 60 * 60) * 1000;
var oneHour = (60 * 60) * 1000;
var oneMinute = 60 * 1000;
var value_calc = 0;
var timems = input_dur.getNumericValue();

if (timems > oneDay) {

value_calc = timems / oneDay;
new_day = parseInt(value_calc);
value_calc = (value_calc - new_day);
value_calc = value_calc * 8;

} else {
if (timems > oneHour) {

value_calc = timems / oneHour;

} else {
new_minute = timems / oneMinute;
tag = true;
}


}


if (!tag) {


new_hour = parseInt(value_calc);
value_calc = (value_calc - new_hour);
add_day = parseInt(new_hour / 8);
new_hour = new_hour - (add_day * 8);
new_day = new_day + add_day;
value_calc = value_calc * 60;
new_minute = parseInt(value_calc);


}

value_calc = ((new_day * (24 * 60 * 60 * 1000)) + (new_hour * (60 * 60 * 1000)) + (new_minute * (60 * 1000)));


var final_dur = input_dur;
final_dur.setNumericValue(value_calc);
return final_dur;

}