我在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。您已经大量帮助了,我感谢您花时间来帮助解决这个问题,并且一致地回复最新的帮助以回应反馈/进一步的问题!谢谢你们!
答案 0 :(得分:2)
使用AVG
功能
SELECT avg(cast(lastprocesseddate as date)-cast(importeddate as date))
FROM feedqueueitems
WHERE eventid = 2213283
ORDER BY written DESC;
在importdate和lastprocesseddate的+1时区的数据库上是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;
答案 1 :(得分: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。 (它似乎不喜欢显示间隔,因此无法演示)。
答案 2 :(得分: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;