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; 
相關問題