1

我在类型TIMESTAMP(6)与时区数据库有2列的列表。我已经从另一个中减去一个来获得两个时间戳之间的时间。平均TIMESTAMP(6)与TIME ZONE次

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。你俩都有助于大规模和我感谢您抽出宝贵的时间来帮助这一点,双方始终与更新的帮助响应反馈/其他问题包退!多谢你们!

+0

的【如何平均时间间隔?](http://stackoverflow.com/questions/450581/how-to-average-time-intervals) – GolezTrol

回答

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; 
+0

你好,对不起,我应该有noted-我可能重复已经尝试过AVG,但它错误。我编辑了我的OP来反映这一点。 – James

+0

@ user2534905做这项工作? – Matt

+0

嗨,是的,它不再错误,我只是想弄清楚它现在返回的意义。我在一个数据库中获得了-0.0416605341348811498065229408512990602551,在另一个数据库中获得了0.00001144103873988931460195828011919965942953,在第三个中获得了0.00000986426767676767676767676767676767676767。所以我很难区分这意味着什么! – James

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 with answer in seconds。 (它似乎不喜欢显示时间间隔,所以不能演示)。

+0

嗨,感谢您花时间和精力编写此回复。我试过这个方法,当运行您在帖子开始提供的查询时,我简单地将AVG_GAP返回为(null)。 – James

+0

@ user2534905 - 在数据库中select select lastprocesseddate-importeddate from feedqueueitems where eventid = 2213283'返回数据? –

+0

是的,我忽视了我的评论 - 我使用了不正确的matchid。这很棒!我得到了(小数点后三位) - 0.909,0.504和0.734。如果我正确读取它,这是否意味着导入和最后处理之间的平均时间为0.909秒,0.504秒和0.734秒? – James

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; 
相关问题