среднее время оракул sql - PullRequest
       2

среднее время оракул sql

0 голосов
/ 17 декабря 2018

Я пытаюсь найти время начала avg для диапазона дат, но функция avg не работает на 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 голосов
/ 18 декабря 2018

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 = 6 вечера), все они могут быть усреднены, давая другое значение с плавающей точкой, которое является средним временем (6 утра и 6 часов вечера - среднее, полдень. 0,25 и 0,75 года - среднее0,5).

Добавление этого обратно к любой дате (например, trunc (sysdate)) дает дату и время, а to_char просто печатает его часть времени, отбрасывая дату.Oracle должен быть достаточно умен, чтобы не настаивать на группировке по усечению (sysdate)

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=2563874ab5566f9ff6030601497b718b

0 голосов
/ 17 декабря 2018

Чтобы рассчитать среднее время, вы должны использовать:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...