Кросс-таблицы отчета BIRT: как рассчитать и отобразить продолжительность времени?

У меня есть отчет BIRT, в котором отображается некоторая статистика звонков на определенную линию в определенные дни. Теперь мне нужно добавить новую меру под названием «время обработки вызова». Данные собираются из БД MySQL:

TIME_FORMAT(SEC_TO_TIME(some calculations on the duration of calls in seconds),'%i:%s') AS "CHT"

Мне не удается отобразить продолжительность в кросс-таблице в формате «мм:сс», даже если я не конвертирую в строку. Я могу отображать секунды, не преобразовывая их во время/строку, но это не очень понятно для человека. Также я должен добавить «общий итог», который вычисляет среднее значение за все дни. Нет проблем при использовании секунд, но я понятия не имею, как это сделать в формате времени.

Какие типы данных/функции/выражения/настройки необходимо использовать в запросе, определении куба данных и ячейке кросс-таблицы, чтобы все заработало?


person m00hk00h    schedule 11.07.2013    source источник


Ответы (2)


Формат времени не является мерой продолжительности, его нельзя суммировать или использовать для среднего значения. Решение состоит в том, чтобы сохранить «секунды» в качестве меры в кубе данных для вычисления агрегатов и создать производную меру для отображения.

В своем кубе данных выберите эту меру «секунды» и нажмите «добавить», чтобы создать производную меру. Я бы использовал математические функции BIRT для построения этого выражения:

  BirtMath.round(measure["seconds"]/60)+":"+BirtMath.mod(measure["seconds"],60)
person Dominique    schedule 12.07.2013
comment
Это сделало это. Я пробовал что-то подобное раньше, но не знал, что мне нужно использовать новую производную меру. Спасибо, что указали мне правильное направление. - person m00hk00h; 12.07.2013

Вот некоторые вещи, на которые следует обратить внимание: секунды отображаются как однозначные значения (если ‹10). Значения «секунд», на которых это основано, не являются целыми числами, поэтому мне также понадобился еще один round() для секунд, в результате чего секунды иногда были «60». Поэтому мне пришлось ввести еще несколько условий JavaScript для отображения правильного форматирования, в том числе вообще не отображать, если «0:00». Для столбца «Итоги» я использовал итоговое значение секунд и сделал то же самое, что и ниже.

Это фактический сценарий, который я использовал:

if (measure["seconds"] > 0)
{
    var seconds = BirtMath.round(BirtMath.mod(measure["seconds"],60));
    var minutes = BirtMath.round(measure["seconds"]/60);
    if(seconds == 60)
    {
        seconds = 0;
    }
    if (seconds < 10)
    {
        minutes + ":0" + seconds;
    }
    else
    {
        minutes + ":" + seconds;
    }
}
person m00hk00h    schedule 12.07.2013