当前位置:  开发笔记 > 前端 > 正文

如何平均时间间隔?

如何解决《如何平均时间间隔?》经验,为你挑选了3个好方法。

在Oracle 10g中,我有一个表,其中包含时间戳,显示某些操作需要多长时间.它有两个时间戳字段:starttime和endtime.我想找到这些时间戳给出的持续时间的平均值.我尝试:

select avg(endtime-starttime) from timings;

但得到:

SQL错误:ORA-00932:不一致的数据类型:预期NUMBER获得INTERVAL DAY TO SECOND

这有效:

select
     avg(extract( second from  endtime - starttime) +
        extract ( minute from  endtime - starttime) * 60 +
        extract ( hour   from  endtime - starttime) * 3600) from timings;

但是真的很慢.

有没有更好的方法将间隔转换为秒数,或者其他方式做到这一点?

编辑:真正放慢这一点的是我在开始时间之前有一些终结时间.由于某些原因,这个计算非常缓慢.我的基本问题是通过从查询集中删除它们来解决的.我还定义了一个函数来更容易地进行这种转换:

FUNCTION fn_interval_to_sec ( i IN INTERVAL DAY TO SECOND )
RETURN NUMBER
IS
  numSecs NUMBER;
BEGIN
  numSecs := ((extract(day from i) * 24
         + extract(hour from i) )*60
         + extract(minute from i) )*60
         + extract(second from i);
  RETURN numSecs;
END;

Vadzim.. 21

在Oracle中,有一种更短,更快,更好的方式可以在几秒钟内获得DATETIME差异,而不是使用多个提取的毛茸茸公式.

试试这个以秒为单位获得响应时间:

(sysdate + (endtime - starttime)*24*60*60 - sysdate)

在减去TIMESTAMP时,它还会保留小数部分秒.

有关详细信息,请参见http://kennethxu.blogspot.com/2009/04/converting-oracle-interval-data-type-to.html.


请注意,自定义pl/sql函数具有显着的性能开销,可能不适合繁重的查询.



1> Vadzim..:

在Oracle中,有一种更短,更快,更好的方式可以在几秒钟内获得DATETIME差异,而不是使用多个提取的毛茸茸公式.

试试这个以秒为单位获得响应时间:

(sysdate + (endtime - starttime)*24*60*60 - sysdate)

在减去TIMESTAMP时,它还会保留小数部分秒.

有关详细信息,请参见http://kennethxu.blogspot.com/2009/04/converting-oracle-interval-data-type-to.html.


请注意,自定义pl/sql函数具有显着的性能开销,可能不适合繁重的查询.



2> jimmyorr..:

如果您的结束时间和开始时间不在彼此的一秒之内,您可以将时间戳作为日期投射并进行日期算术:

select avg(cast(endtime as date)-cast(starttime as date))*24*60*60 
  from timings;



3> Chris R. Don..:

最干净的方法是编写自己的聚合函数来执行此操作,因为它将以最干净的方式处理它(处理亚秒级分辨率等).

事实上,这个问题曾经在asktom.oracle.com上被问及(并回答)了一段时间(文章包含源代码).

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有