Если вы хотите сделать это, вы можете использовать функциональный индекс (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;