如何获得Oracle中两个时间戳之间的平均值

问题描述:

我需要您的一些帮助。如何获得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'' –

请尝试使用以下提到的代码

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

如果列时间戳然后使用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 xTex

+0

很容易假设复杂的位是失败的项目,回到基础常常帮助我们重新聚焦......如果该列是时间戳,请使用TO_TIMESTAMP ** ** –