for循环中循环PL / SQL的平均值



我试图计算过去40天内不同id的平均持续时间。示例:我有40天,每一天的ID从1到20,每个ID都有开始日期和结束日期,格式为HH:MI:SS。

我的代码是一个光标获取过去40天,然后我做了第二个for循环。在这个例子中,我选择了当天的所有id。然后我遍历当天的每个ID,并选择开始和结束数据来计算持续时间。到目前为止一切顺利。但是如何计算过去40天内id的平均持续时间呢?

这个想法很简单。取一个id(过去40天)的持续时间,将它们相加并除以40。然后对所有id做同样的处理。我的计划是制作一个2d数组,并在第一个数组中放置所有id,然后在第二个数组中放置持续时间并将一个id的值添加在一起。然后,我将一个ID的所有持续时间加在一起,并从数组中获得值。但是我有点被那个想法困住了。

我也想知道是否有更好的解决方案。

谢谢你的帮助!

在我看来,你不需要循环,也不需要PL/SQL -只需计算平均值:

select id, 
avg(end_date - start_date)
from your_table
where start_date >= trunc(sysdate) - 40
group by id

缺点可能是您所说的—您将日期存储为hh:mi:ss。这是什么意思?你把它们存储为字符串?如果是这样,很可能是个坏主意;日期(因为Oracle没有单独的时间数据类型)应该存储在DATE数据类型列中。

如果你真的需要处理字符串,那么转换成日期:

avg(to_date(end_date, 'hh:mi:ss') - to_date(start_date, 'hh:mi:ss'))

此外,您还必须有另一个DATE数据类型列,该列能够显示"过去40天";实际上的意思。

结果(平均值)将是天数在这些值之间。如果你愿意,你可以把它格式化得更漂亮。

最新更新