如何计算和只有时间戳的总时间长度?

时间:2017-02-28 18:47:02

标签: crystal-reports

我正在使用Crystal Reports 2016.我有一些datetime值表示某些内容发生了变化。我有datetime值变化的数值。在这种情况下,某些网络连接正在改变3个值(0,1,2)之间的状态。我想计算期间和期间的总数;然后绘制各个时期的比例和报告的时间。我已经完成了一些,但我认为我采取了错误的方法,因为最后一点不起作用。

我有在线,离线和部分在线的公式,(分别)如此:

If {CRV_AttributeLog.AnalogValue}=2
  Then {CRV_AttributeLog.LogTimeStamp}

If {CRV_AttributeLog.AnalogValue}=0
  Then {CRV_AttributeLog.LogTimeStamp}

If {CRV_AttributeLog.AnalogValue}=1
  Then {CRV_AttributeLog.LogTimeStamp}

我有公式来计算各州之间的时期:

在线

abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOffline})) +
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOnline})) 

离线

abs(dateDiff("s", next({@TimeStampOffline}), {@TimeStampOnline})) +
abs(dateDiff("s", next({@TimeStampOffline}), {@TimeStampPartiallyOnline})) 

部分在线

abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOffline})) +
abs(dateDiff("s", next({@TimeStampPartiallyOnline}), {@TimeStampOnline})) 

我不能总结计算期间的公式,大概是因为我有第一组有效变量的公式; Crystal Reports不喜欢公式的嵌套。我不能只用copypasta用if ... then表达式替换公式名称;当我检查错误时,这会给我一个错误(一个字段必须在这里)。我想过将if语句放在前面,只做一个操作,如果它是一个离线记录,但我不能引用其他时间戳。

我可以将时间段放入图表中,然后将它们添加起来。但是,计算的时间并不代表报告执行期间的所有时间,因此,虽然比率仍然大部分都很好,但由于数据的特性,结果图表不是100%正确。对于边缘情况,我无法计算连接脱机的总时间。例如,如果连接在报告的整个长度上处于脱机状态,则会有许多时间戳表示它处于脱机状态,但由于没有时间戳记在线,因此脱机时间段为0,从而丢失图表。

如何计算这些期间,然后将它们与报告的时间长度进行比较?我已经创建了一个公式,它给出了报告中的时间长度(除数又称分子),但我需要分红(分母)进行计算。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用Next()函数的Crystal Reports计算必须等到所有排序,分组和总计完成之后。他们工作,但他们严格限制你可以用Crystal做的结果。最好的方法是编写SQL查询,以便将每条记录链接到下一条记录。这样,Crystal看到的数据集包括同一记录中的句点的开头和句点的结尾。如何编写SQL将是一个很好的单独问题。

对于没有值的边缘情况,我认为您希望使用IF-THEN逻辑将缺失值替换为目标周期的开始或目标周期的结束。