我正在尝试查找日期范围的平均开始时间,但是平均功能似乎无法在to_char(cast(Start_Dt as date),'HH24:MI')
上运行(Start_Dt示例:12/12/18 02:30:13
)。关于如何获得理想结果的任何想法?
样本:
SELECT
job_nm
avg(to_char(cast(Start_Dt as date),'HH24:MI'))
FROM batch_table
Where Start_Dt >= trunc(sysdate-10)
group by job_nm
错误:ORA-01722:无效的号码 01722. 00000-“无效编号” *原因:指定的号码无效。 *操作:指定一个有效的数字。
理想的结果是
该查询仅查看最近10天内运行的作业以及该期间的平均开始时间。
预期的结果:
JOB_NM | AVG Time
open | 2:30
close | 3:30
答案 0 :(得分:4)
要计算平均时间,您可以使用:
SELECT
job_nm,
TO_CHAR(
TO_DATE(
AVG(
TO_NUMBER(
TO_CHAR(
TO_DATE(
TO_CHAR(Start_Dt,'HH24:MI:SS'),
'HH24:MI:SS'),
'sssss')
)
),
'sssss'),
'hh24:mi:ss')
FROM batch_table
WHERE Start_Dt >= trunc(sysdate-10)
GROUP BY job_nm;
这是另一种选择,也许不太复杂:
SELECT
job_nm,
FLOOR(24 * AVG(Start_Dt- TRUNC(Start_Dt)))
|| ':'
|| FLOOR(MOD(24 * AVG(Start_Dt - TRUNC(Start_Dt)),1) * 60)
|| ':'
|| FLOOR(MOD(MOD(24 * AVG(Start_Dt- TRUNC(Start_Dt)),1) * 60,1) * 60)
FROM batch_table
WHERE Start_Dt >= trunc(sysdate-10)
GROUP BY job_nm;
以防万一,如果您要计算平均日期,则可以将日期转换为儒略日期格式,计算平均值,然后转换回日期,例如:
SELECT
job_nm,
TO_DATE(
ROUND(
AVG(
TO_NUMBER(TO_CHAR(Start_Dt, 'J'))
)
),
'J')
FROM batch_table
WHERE Start_Dt >= trunc(sysdate-10)
GROUP BY job_nm;
答案 1 :(得分:4)
在将日期视为浮点数时,Oracle非常灵活,因此在公认的答案中可能不需要大量复杂的数据类型转换:
SELECT
job_nm,
to_char(trunc(sysdate) + avg(start_dt - trunc(start_dt)),'HH24:MI')) avg_time
FROM batch_table
Where Start_Dt >= trunc(sysdate-10)
group by job_nm
之所以起作用,是因为start_dt - trunc(start_dt)
是介于0和1之间的一个浮点数,代表一天中的某个时间(0.5 =中午12点,0.75 = 6pm),所有这些都可以取平均值,得出另一个浮点数,即平均时间(上午6点和平均为下午6点,中午。平均0.25和0.75为0.5)。
将此日期重新添加到任何日期(例如trunc(sysdate))会给出日期和时间,而to_char只是将其时间部分打印出来,将日期扔掉。 Oracle应该足够聪明,不要坚持要求您按trunc(sysdate)分组
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=2563874ab5566f9ff6030601497b718b