平均时间oracle sql

时间:2018-12-17 19:58:24

标签: sql oracle

我正在尝试查找日期范围的平均开始时间,但是平均功能似乎无法在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

2 个答案:

答案 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