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.

How to group by date portion of sys_created_on in a GlideAggregate

gjz1
Giga Expert

I have an audit log that may have multiple rows per day per person and I need to find the last row per person per day.  For example:

Person A: 2020-01-21 09:00:00
Person A: 2020-01-21 08:45:00
Person A: 2020-01-21 07:00:00
Person B: 2020-01-21 09:00:00

Person A: 2020-01-20 08:45:00
Person B: 2020-01-20 07:00:00
Person B: 2020-01-20 06:59:00

Person A: 2020-01-19 09:00:00
Person B: 2020-01-19 09:00:00

What I want to see in the output is

Person A: 2020-01-21 09:00:00
Person B: 2020-01-21 09:00:00
Person A: 2020-01-20 08:45:00
Person B: 2020-01-20 07:00:00
Person A: 2020-01-19 09:00:00
Person B: 2020-01-19 09:00:00

I want to group by person and date (not time) - but I can't figure out how to group by the date portion of sys_created_on.  Does anyone know how to do that?

Here's my query, which works fine except for agg.groupBy('sys_created_on').  I have an encoded query which will be removed in the final version, I just wanted to limit the rows while testing.

var agg = new GlideAggregate('u_hourly_employee_time_tracking');
agg.addEncodedQuery("sys_created_onBETWEENjavascript:gs.dateGenerate('2020-01-19','00:00:00')@javascript:gs.dateGenerate('2020-01-21','09:01:00')");
agg.addAggregate('MAX', 'sys_created_on');
agg.groupBy('u_employee_name');
agg.groupBy('u_status');
agg.groupBy('sys_created_on');
agg.query();
while(agg.next()) {
    answer = agg.getAggregate('MAX', 'sys_created_on');
    gs.print('row: ' + agg.u_employee_name + '  ' + answer + '  ' + agg.u_status);
}

6 REPLIES 6

Nagasai
ServiceNow Employee
ServiceNow Employee

Not possible to GlideAggregate dateTime fields as glideDate. here is custom logic -

Create few records in sc_task table with work_start and work_end field values. 

Update addEncodedQuery as per your requirement

Now execute the below script.

this.dataMap = {};

var taskGr = new GlideRecord("sc_task");
taskGr.addEncodedQuery("work_startBETWEENjavascript:gs.dateGenerate('2022-01-20','00:00:00')@javascript:gs.dateGenerate('2022-01-24','23:59:59')^work_endBETWEENjavascript:gs.dateGenerate('2022-01-20','00:00:00')@javascript:gs.dateGenerate('2022-01-24','23:59:59')");
taskGr.orderBy("work_start");
taskGr.orderBy("work_end");
taskGr.query();
while (taskGr.next()) {

var number = taskGr.getValue("number");

var startTime = taskGr.work_start;
var endTime = taskGr.work_end;
var start = new GlideDateTime(startTime).getDate();
var end = new GlideDateTime(endTime).getDate();

//gs.info(startTime+"-"+endTime);
//gs.info(start+" ** "+ end);

var startEnd = start + "-" + end;
if (this.dataMap.hasOwnProperty(startEnd))
this.dataMap[startEnd].taskNums.push(number);
else {
var obj = {};
obj.taskNums = [number];
this.dataMap[startEnd] = obj;
}


}
//gs.info(this.dataMap)
gs.info(JSON.stringify(this.dataMap));

for (var tasks in this.dataMap) {
var taskData = this.dataMap[tasks];
gs.info("In for " + taskData);

var changeSysId = "";
for (var k in taskData.taskNums) {
var taskNum = taskData.taskNums[k];
gs.info(taskNum);
var sctaskGr = new GlideRecord("sc_task");
sctaskGr.addQuery("number", taskNum);
sctaskGr.query();
if (sctaskGr.next()) {
   gs.info(sctaskGr.work_start + " | " + sctaskGr.work_end);

}
}

}

garyopela
ServiceNow Employee
ServiceNow Employee

Hello, there is actually a way I just figured out. You can use addTrend. Here is an example:

 

 

var grChatDur = new GlideAggregate('interaction');

var chatDurQuery = "state=closed_complete^type=chat^assignment_group.name=HR Contact Center";

grChatDur.addEncodedQuery(chatDurQuery);

grChatDur.addAggregate('COUNT');

grChatDur.addAggregate('SUM', 'duration');

grChatDur.addTrend('sys_created_on','date');

grChatDur.addAggregate('AVG', 'duration');

grChatDur.setGroup(false);

grChatDur.setOrder(false);

grChatDur.query();

while (grChatDur.next()){

    gs.info('Date: ' + grChatDur.getValue('timeref') + ' Count: ' + grChatDur.getAggregate('COUNT') + ' Sum: ' + grChatDur.getAggregate('SUM', 'duration') + ' Average: ' + grChatDur.getAggregate('AVG', 'duration'));

}

 

I hope that works 🙂 It looks good at first for me at least.