1

我在 TIMESTAMP(6) WITH TIME ZONE 类型的数据库中有 2 列。我已经从另一个中减去一个以获得两个时间戳之间的时间。

select lastprocesseddate-importeddate 
from feedqueueitems 
where eventid = 2213283 
order by written desc;

如何获得我所拥有的时差列表的平均值?

以下是时间差异的一小部分示例:

+00 00:00:00.488871    
+00 00:00:00.464286  
+00 00:00:00.477107  
+00 00:00:00.507042  
+00 00:00:00.369144  
+00 00:00:00.488918  
+00 00:00:00.354797  
+00 00:00:00.378801  
+00 00:00:00.320040  
+00 00:00:00.361242  
+00 00:00:00.302327  
+00 00:00:00.331441  
+00 00:00:00.324065

编辑:我也应该注意到 - 我已经尝试过 AVG 功能,它只是返回

ORA-00932: inconsistent datatypes: expected NUMBER got INTERVAL DAY TO SECOND
00932. 00000 -  "inconsistent datatypes: expected %s got %s"
*Cause:    
*Action:
Error at Line: 3 Column: 29

EDIT2:只是为了澄清上面的片段。第 3 行是我的 SQL 查询,格式如下:

select AVG(lastprocesseddate-importeddate) from feedqueueitems where eventid = 2213283;

EDIT3:非常感谢 Matt 和 Alex Poole。你们都提供了巨大的帮助,我感谢你们抽出宝贵的时间来帮助解决这个问题,并为响应反馈/进一步的问题而不断返回更新的帮助!多谢你们!

4

3 回答 3

2

使用AVG功能

SELECT avg(cast(lastprocesseddate as date)-cast(importeddate as date))
FROM feedqueueitems 
WHERE eventid = 2213283 
ORDER BY written DESC;

在具有 +1 时区的数据库上,importeddate 和 lastprocesseddate 是 UTC

SELECT avg(cast(cast(lastprocesseddate as timestamp with time zone) at time zone '+01:00' as date)-cast(importeddate as date))
FROM feedqueueitems 
WHERE eventid = 2213283 
ORDER BY written DESC;
于 2015-04-23T10:12:37.923 回答
2

您可以从每个间隙值中提取时间分量,这是一种间隔数据类型,因此您最终会得到一个以秒为单位的数字(包括小数部分),然后对它们进行平均:

select avg(extract(second from gap)
    + extract(minute from gap) * 60
    + extract(hour from gap) * 60 * 60
    + extract(day from gap) * 60 * 60 * 24) as avg_gap
from (
  select lastprocesseddate-importeddate as gap
  from feedqueueitems
  where eventid = 2213283
);

使用 CTE 提供您显示的间隔值的演示:

with cte as (
  select interval '+00 00:00:00.488871' day to second as gap from dual
  union all select interval '+00 00:00:00.464286' day to second from dual
  union all select interval '+00 00:00:00.477107' day to second from dual
  union all select interval '+00 00:00:00.507042' day to second from dual
  union all select interval '+00 00:00:00.369144' day to second from dual
  union all select interval '+00 00:00:00.488918' day to second from dual
  union all select interval '+00 00:00:00.354797' day to second from dual 
  union all select interval '+00 00:00:00.378801' day to second from dual
  union all select interval '+00 00:00:00.320040' day to second from dual
  union all select interval '+00 00:00:00.361242' day to second from dual
  union all select interval '+00 00:00:00.302327' day to second from dual
  union all select interval '+00 00:00:00.331441' day to second from dual
  union all select interval '+00 00:00:00.324065' day to second from dual
)
select avg(extract(second from gap)
    + extract(minute from gap) * 60
    + extract(hour from gap) * 60 * 60
    + extract(day from gap) * 60 * 60 * 24) as avg_gap
from cte;

   AVG_GAP
----------
.397544692

或者,如果您希望将其作为间隔:

select numtodsinterval(avg(extract(second from gap)
    + extract(minute from gap) * 60
    + extract(hour from gap) * 60 * 60
    + extract(day from gap) * 60 * 60 * 24), 'SECOND') as avg_gap
...

这使

AVG_GAP            
--------------------
0 0:0:0.397544692   

SQL Fiddle 在几秒钟内得到答案。(目前似乎不喜欢显示间隔,所以不能演示)。

于 2015-04-23T10:42:07.490 回答
0

这个查询应该可以解决这个问题。

WITH t AS 
    (SELECT 
        TIMESTAMP '2015-04-23 12:00:00.5 +02:00' AS lastprocesseddate,  
        TIMESTAMP '2015-04-23 12:05:10.21 UTC' AS importeddate 
    FROM dual)
SELECT 
    AVG(
        EXTRACT(SECOND FROM SYS_EXTRACT_UTC(lastprocesseddate) - SYS_EXTRACT_UTC(importeddate))
        + EXTRACT(MINUTE FROM SYS_EXTRACT_UTC(lastprocesseddate) - SYS_EXTRACT_UTC(importeddate)) * 60
        + EXTRACT(HOUR FROM SYS_EXTRACT_UTC(lastprocesseddate) - SYS_EXTRACT_UTC(importeddate)) * 60 * 60
        + EXTRACT(DAY FROM SYS_EXTRACT_UTC(lastprocesseddate) - SYS_EXTRACT_UTC(importeddate)) * 60 * 60 * 24
    ) AS average_gap
FROM t;
于 2015-04-23T13:07:18.870 回答