BIRT报告交叉标签:如何计算和显示持续时间?

时间:2013-07-11 10:55:08

标签: birt crosstab

我有一个BIRT报告,显示某些日期某些行的来电统计信息。现在我必须添加一个名为“呼叫处理时间”的新功能。数据从MySQL DB收集:

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

即使没有转换为String,我也无法在“mm:ss”格式中显示交叉表中的持续时间。我可以通过不将它们转换为时间/字符串来显示秒数,但这不是人类可读的。 此外,我应该添加一个“总计”来计算所有日子的平均值。使用秒时没问题,但我不知道如何以时间格式执行此操作。

我必须在查询,数据立方体定义和交叉表单元格中使用哪些数据类型/ functoins /表达式/设置才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

时间格式不是持续时间度量,不能归纳或用于平均值。解决方案是在数据立方体中将“秒”作为度量来计算聚合,并创建用于显示的派生度量。

在您的datacube中,选择此“秒”度量并单击“添加”以创建派生度量。我会使用BIRT数学函数来构建这个表达式:

  BirtMath.round(measure["seconds"]/60)+":"+BirtMath.mod(measure["seconds"],60)

答案 1 :(得分:0)

以下是需要注意的事项:秒显示为单个数字值(如果< 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;
    }
}