Если вы хотите сделать это, вы можете использовать функциональный индекс (fbi), который спасет вас от запуска или обновления столбца вручную. Fbi может использоваться в предложении where, но также и в предложении select.

cle 10g у меня есть таблица, в которой хранятся метки времени, показывающие, сколько времени занимали определенные операции. Он имеет два поля отметки времени: время начала и время окончания. Я хочу найти средние значения продолжительности, указанные этими временными метками. Я пытаюсь:

select avg(endtime-starttime) from timings;

Но получите:

Ошибка SQL: ORA-00932: несовместимые типы данных: ожидается, что ЧИСЛО получило ИНТЕРВАЛЬНЫЙ ДЕНЬ ВТОРОЙ

Это работает:

select
     avg(extract( second from  endtime - starttime) +
        extract ( minute from  endtime - starttime) * 60 +
        extract ( hour   from  endtime - starttime) * 3600) from timings;

Но это действительно медленно.

Есть ли лучший способ превратить интервалы в числа секунд, или как-то иначе?

РЕДАКТИРОВАТЬ: То, что действительно замедляло это, было то, что у меня было некоторое время до начала. По некоторым причинам это сделало этот расчет невероятно медленным. Моя основная проблема была решена путем исключения их из набора запросов. Я также определил функцию, чтобы сделать это преобразование проще:

FUNCTION fn_interval_to_sec ( i IN INTERVAL DAY TO SECOND )
RETURN NUMBER
IS
  numSecs NUMBER;
BEGIN
  numSecs := ((extract(day from i) * 24
         + extract(hour from i) )*60
         + extract(minute from i) )*60
         + extract(second from i);
  RETURN numSecs;
END;

Ответы на вопрос(1)

Ваш ответ на вопрос