Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

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

Community Alums
Not applicable

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

Community Alums
Not applicable

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
Tera Contributor

Hi,

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

Community Alums
Not applicable

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

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

Community Alums
Not applicable

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;

}