2017-05-29 240 views
0

我需要您的一些幫助。如何獲得Oracle中兩個時間戳之間的平均值

下面的SQL語句應該用於獲取兩個時間戳(e.p_ende和e.p_start之間的差異)之間的計算的毫秒數。 計算工作到目前爲止。 當我在時間戳上只使用一個過濾器時,它也正在工作。

但我需要兩個時間戳之間的值的平均值(lz)。如果我使用這兩個語句,結果始終爲空。

我的第一個聲明是這樣的:

SELECT AVG(LZ) 
    FROM ORGANIZATION.V_UI_LOG_SEND A, 
     (SELECT E.P_ID, (EXTRACT(DAY FROM E.P_ENDE)*24*60*60*1000 
      +EXTRACT(HOUR FROM E.P_ENDE) *60*60*1000 
      +EXTRACT(MINUTE FROM E.P_ENDE) *60*1000 
      +EXTRACT(SECOND FROM E.P_ENDE) *1000) 
      -(EXTRACT(DAY FROM E.P_START)*24*60*60*1000 
      +EXTRACT(HOUR FROM E.P_START)*60*60*1000 
      +EXTRACT(MINUTE FROM E.P_START)*60*1000 
      +EXTRACT(SECOND FROM E.P_START)*1000)AS LZ 
     FROM ORGANIZATION.V_UI_LOG_RECEIVE E) E 
     WHERE E.P_ID = A.UI_ID 
      AND A.P_START >= TO_DATE('20170327070000', 'YYYYMMDDHH24MISS') 
      AND A.P_START <= TO_DATE('20170327090000', 'YYYYMMDDHH24MISS'); 

...和第二條帶間,像這樣:

`SELECT AVG(ECHTLZ) 
    FROM ORGANIZATION.V_UI_LOG_SEND A, 
     (SELECT E.P_ID, (EXTRACT(DAY FROM E.P_ENDE)*24*60*60*1000 
      +EXTRACT(HOUR FROM E.P_ENDE) *60*60*1000 
      +EXTRACT(MINUTE FROM E.P_ENDE) *60*1000 
      +EXTRACT(SECOND FROM E.P_ENDE) *1000) 
      -(EXTRACT(DAY FROM E.P_START)*24*60*60*1000 
      +EXTRACT(HOUR FROM E.P_START)*60*60*1000 
      +EXTRACT(MINUTE FROM E.P_START)*60*1000 
      +EXTRACT(SECOND FROM E.P_START)*1000)AS ECHTLZ 
     FROM ORGANIZATION.V_UI_LOG_RECEIVE E) E 
     WHERE E.P_ID = A.UI_ID 
      AND A.P_START between TO_DATE('20170327070000', 
      'YYYYMMDDHH24MISS') 
      AND TO_DATE('20170327090000', 'YYYYMMDDHH24MISS');` 

感謝您的閱讀和幫助! :)

編輯:

非常感謝大家!解決方案要容易得多。我連接到錯誤的數據庫。這張桌子在那裏存在,名字相同,但沒有數據......第一個聲明一直在正常工作。我很抱歉花費您的寶貴時間!

+0

「P_START」和「P_ENDE」的數據類型是什麼? –

+0

P_START和P_ENDE是時間戳(6) – xTex

+0

奇怪,嘗試'TO_TIMESTAMP之間A.P_START( '20170327070000', 'YYYYMMDDHH24MISS') AND TO_TIMESTAMP( '20170327090000', 'YYYYMMDDHH24MISS')'或'A.P_START TIMESTAMP'之間2017-03-27 07:00:00'AND TIMESTAMP'2017-03-27 09:00:00'' –

回答

0

請嘗試使用以下提到的代碼

SELECT AVG(ECHTLZ) 
FROM ORGANIZATION.V_UI_LOG_SEND A, 
    (SELECT E.P_ID, 
    (E.P_ENDE -E.P_START)*60*24*60 AS ECHTLZ 
    FROM ORGANIZATION.V_UI_LOG_RECEIVE E 
) E 
WHERE E.P_ID = A.UI_ID 
AND A.P_START BETWEEN TO_DATE('20170327070000', 'YYYYMMDDHH24MISS') AND TO_DATE('20170327090000', 'YYYYMMDDHH24MISS') 

這將在幾秒鐘內給平均

+0

非常感謝您的回答!但結果是錯誤00932. 00000 - 」不一致的數據類型:預期的%s得到%s「 – xTex

+0

這是行不通的,因爲'P_START'和'P_ENDE'是'TIMESTAMP'數據類型。結果將是一個'INTERVAL'數據類型而不是'NUMBER',在這裏你不能進行乘法運算 –

+0

感謝你的知識, domscheit! – xTex

0

如果列時間戳然後使用TO_TIMESTAMP()代替TO_DATE()

什麼這個查詢產生了嗎?

SELECT DISTINCT A.UI_ID 
FROM ORGANIZATION.V_UI_LOG_SEND A 
WHERE A.P_START >= TO_TIMESTAMP('20170327070000', 'YYYYMMDDHH24MISS') 
AND A.P_START <= TO_TIMESTAMP('20170327090000', 'YYYYMMDDHH24MISS'); 

如果沒有行,以滿足時間戳範圍內,那麼如果有從該查詢行,則請他們匹配的行中的其他視圖整個查詢將NULL

SELECT DISTINCT A.UI_ID 
FROM ORGANIZATION.V_UI_LOG_SEND A 
INNER JOIN ORGANIZATION.V_UI_LOG_RECEIVE E ON E.P_ID = A.UI_ID 
WHERE A.P_START >= TO_TIMESTAMP('20170327070000', 'YYYYMMDDHH24MISS') 
AND A.P_START <= TO_TIMESTAMP('20170327090000', 'YYYYMMDDHH24MISS'); 

如果有從該查詢行那麼你平均計算也應該工作,雖然你必須要滿足空值。(+ EDIT)

SELECT E.P_END, E.P_START 
FROM ORGANIZATION.V_UI_LOG_SEND A 
INNER JOIN ORGANIZATION.V_UI_LOG_RECEIVE E ON E.P_ID = A.UI_ID 
WHERE A.P_START >= TO_TIMESTAMP('20170327070000', 'YYYYMMDDHH24MISS') 
AND A.P_START <= TO_TIMESTAMP('20170327090000', 'YYYYMMDDHH24MISS') 
AND (E.P_END IS NOT NULL AND E.P_START IS NOT NULL); 

如果這個返回的數據那麼你平均計算也應該工作。

+0

謝謝您的幫助,解決的辦法是要容易得多。我使用了錯誤的數據庫連接-.-!」 '和A.P_START> = TO_DATE(:QUERYDATUM1, 'YYYYMMDDHH24MISS') AND A.P_START <= TO_DATE(:QUERYDATUM2,'YYYYMMDDHH24MISS') ' 一直在工作。 – xTex

+0

很容易假設複雜的位是失敗的項目,回到基礎常常幫助我們重新聚焦......如果該列是時間戳,請使用TO_TIMESTAMP ** ** –

相關問題