Ir ao conteúdo

Oracle script Oracle average time descobrir o tempo de execução de cada linha


Ir à solução Resolvido por DiF,

Posts recomendados

Postado

Bom dia  tenho a query abaixo , precisava descobrir o tempo de execucao de cada linha , ou seja calcular tempo gasto, não manjo muito pra fazer.

 

SELECT START_DATE_TIME, END_DATE_TIME 
FROM (SELECT B.START_DATE_TIME,B.END_DATE_TIME 
      FROM ESP_APPLICATION A, ESP_GENERIC_JOB B WHERE A.APPL_NAME ='LELO' 
      AND A.APPL_ID = B.APPL_ID AND B.JOB_NAME ='UNIX0' AND B.JOB_QUALIFIER =' ' 
      AND B.STATE = 'COMPLETE' 
      ORDER BY B.END_DATE_TIME DESC);

 

hj o resultado sai assim . 

 

    start_date_time     |     end_date_time
------------------------+------------------------
 2026-04-07 10:07:14.96 | 2026-04-07 10:07:44.97
 2026-04-06 21:54:31.28 | 2026-04-06 21:55:01.28
 2026-04-06 21:39:56.16 | 2026-04-06 21:40:26.16
 2026-04-06 21:38:52.66 | 2026-04-06 21:39:22.67
 2026-04-06 21:38:11.84 | 2026-04-06 21:38:41.85
 2026-04-06 21:34:46.06 | 2026-04-06 21:35:16.08
 2026-04-06 21:34:18.75 | 2026-04-06 21:34:48.76
 2026-04-06 21:32:18.25 | 2026-04-06 21:32:48.27
 2026-04-06 21:31:47.99 | 2026-04-06 21:32:18
 2026-04-06 21:30:49.67 | 2026-04-06 21:31:19.69
 2026-04-06 21:30:09.38 | 2026-04-06 21:30:39.39
 2026-04-06 21:29:29.35 | 2026-04-06 21:29:59.37

 

  • DiF alterou o título para script Oracle average time descobrir o tempo de execução de cada linha
  • Moderador
Postado

@Antonio Baptista Tente desta forma:

 

SELECT 
    START_DATE_TIME,
    END_DATE_TIME,
    -- Tempo de execução em segundos (com fração)
    (END_DATE_TIME - START_DATE_TIME) * 86400 AS tempo_execucao_segundos,
    
    -- Versão arredondada e formatada (mais legível)
    ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS tempo_segundos,
    ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) || ' segundos' AS tempo_formatado

FROM (
    SELECT 
        B.START_DATE_TIME,
        B.END_DATE_TIME
    FROM ESP_APPLICATION A,
         ESP_GENERIC_JOB B
    WHERE A.APPL_NAME = 'LELO'
      AND A.APPL_ID = B.APPL_ID
      AND B.JOB_NAME = 'UNIX0'
      AND B.JOB_QUALIFIER = ' '
      AND B.STATE = 'COMPLETE'
    ORDER BY B.END_DATE_TIME DESC
);

 

Se quiser com formatado com horas, minutos e segundos, pode ser feito desta forma:

 

SELECT 
    START_DATE_TIME,
    END_DATE_TIME,
    (END_DATE_TIME - START_DATE_TIME) * 86400 AS tempo_segundos,
    
    -- Formatação amigável: X horas Y minutos Z segundos
    TRUNC(((END_DATE_TIME - START_DATE_TIME) * 86400)/3600) || 'h ' ||
    TRUNC(MOD((END_DATE_TIME - START_DATE_TIME) * 86400, 3600)/60) || 'min ' ||
    ROUND(MOD((END_DATE_TIME - START_DATE_TIME) * 86400, 60), 2) || 's' AS tempo_formatado

FROM (
    SELECT 
        B.START_DATE_TIME,
        B.END_DATE_TIME
    FROM ESP_APPLICATION A,
         ESP_GENERIC_JOB B
    WHERE A.APPL_NAME = 'LELO'
      AND A.APPL_ID = B.APPL_ID
      AND B.JOB_NAME = 'UNIX0'
      AND B.JOB_QUALIFIER = ' '
      AND B.STATE = 'COMPLETE'
    ORDER BY B.END_DATE_TIME DESC
);

 

Basicamente,   como as colunas são TIMESTAMP, a subtração (END_DATE_TIME - START_DATE_TIME) retorna um INTERVAL DAY TO SECOND. 

Multiplicar por 86400 (quantidade de segundos em um dia) converte o intervalo para segundos com precisão decimal.

Usar ROUND(..., 2) permire  limitar as casas decimais.
Se precisar mostrar o tempo em milissegundos, é só multiplicar por 86400000 no lugar de 86400.

 

PS: foi otimizado para Oracle, se usar em outro banco de dados, pode não funcionar como desejado.. aí teria que fazer adaptações de acordo.

Postado

@DiF Bom dia , rodei o comando e derro de syntax , acabei esquecendo de falar nessa base que estou rodando o banco PSQL , em Producao sera base Oracle , sera por isso o erro ?

 

Obrigado

 

cawa_db=# SELECT
cawa_db-#     START_DATE_TIME,
cawa_db-#     END_DATE_TIME,
cawa_db-#     -- Tempo de execução em segundos (com fração)
cawa_db-#     (END_DATE_TIME - START_DATE_TIME) * 86400 AS tempo_execucao_segundos,
cawa_db-#
cawa_db-#     -- Versão arredondada e formatada (mais legível)
cawa_db-#     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS tempo_segundos,
cawa_db-#     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) || ' segundos' AS tempo_formatado
cawa_db-#
cawa_db-# FROM (
cawa_db(#     SELECT
cawa_db(#         B.START_DATE_TIME,
cawa_db(#         B.END_DATE_TIME
cawa_db(#     FROM ESP_APPLICATION A,
cawa_db(#          ESP_GENERIC_JOB B
cawa_db(#     WHERE A.APPL_NAME = 'LELO'
cawa_db(#       AND A.APPL_ID = B.APPL_ID
cawa_db(#       AND B.JOB_NAME = 'UNIX0'
cawa_db(#       AND B.JOB_QUALIFIER = ' '
cawa_db(#       AND B.STATE = 'COMPLETE'
cawa_db(#     ORDER BY B.END_DATE_TIME DESC
cawa_db(# );
ERRO:  função round(interval, integer) não existe
LINHA 8:     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS t...


             ^
DICA:  Nenhuma função corresponde com o nome e os tipos de argumentos informados. Você precisa adicionar conversões de tipo explícitas.

 

@DiF Bom dia , rodei o comando e derro de syntax , acabei esquecendo de falar nessa base que estou rodando o banco PSQL , em Producao sera base Oracle , sera por isso o erro ? Desculpe 

 

Obrigado

 

cawa_db=# SELECT
cawa_db-#     START_DATE_TIME,
cawa_db-#     END_DATE_TIME,
cawa_db-#     -- Tempo de execução em segundos (com fração)
cawa_db-#     (END_DATE_TIME - START_DATE_TIME) * 86400 AS tempo_execucao_segundos,
cawa_db-#
cawa_db-#     -- Versão arredondada e formatada (mais legível)
cawa_db-#     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS tempo_segundos,
cawa_db-#     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) || ' segundos' AS tempo_formatado
cawa_db-#
cawa_db-# FROM (
cawa_db(#     SELECT
cawa_db(#         B.START_DATE_TIME,
cawa_db(#         B.END_DATE_TIME
cawa_db(#     FROM ESP_APPLICATION A,
cawa_db(#          ESP_GENERIC_JOB B
cawa_db(#     WHERE A.APPL_NAME = 'LELO'
cawa_db(#       AND A.APPL_ID = B.APPL_ID
cawa_db(#       AND B.JOB_NAME = 'UNIX0'
cawa_db(#       AND B.JOB_QUALIFIER = ' '
cawa_db(#       AND B.STATE = 'COMPLETE'
cawa_db(#     ORDER BY B.END_DATE_TIME DESC
cawa_db(# );
ERRO:  função round(interval, integer) não existe
LINHA 8:     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS t.

 

  • Curtir 1
  • Moderador
  • Solução
Postado

@Antonio Baptista Bom dia, 

 

18 horas atrás, Antonio Baptista disse:

derro de syntax , acabei esquecendo de falar nessa base que estou rodando o banco PSQL , em Producao sera base Oracle , sera por isso o erro ?

Tem grandes chances de ser extamente o caso.  Mas também, não estava esperando que rodasse de primeira. Isso por não tenho a base de dados, nem sei como é a estrutura das suas tabelas e os registros dela para poder fazer um teste prévio.

 

Meu objetivo, na verdade foi te dar uma luz no fim do túnel, uma base para que você possa analisar o que foi feito e entender, assim criar uma nova instrução SQL com base no que eu postei. Se você copiou e colou, é exatamente o porque do erro. 

Tem coisas ali que podem não ser aceitos onde você terá que substituir os parâmetros e funções que são de acordo com o DB que você usa.

 

Agora pensando no problema,  a função ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) não funciona no PostgreSQL (PSQL), porque a subtração de dois TIMESTAMP (ou TIMESTAMPTZ) retorna um tipo INTERVAL, e não um número decimal de dias como no Oracle. 

Provavelmente, é como eu disse, você terá que readaptar para uma função que funcione com o PSQL.  Por exemplo EXTRACT(EPOCH ...) 

Aqui vai um novo exemplo ( e pode não ser funcional, mas serve como estudo):

 

WITH jobs AS (
    SELECT 
        B.START_DATE_TIME,
        B.END_DATE_TIME,
        EXTRACT(EPOCH FROM (B.END_DATE_TIME - B.START_DATE_TIME)) AS segundos
    FROM ESP_APPLICATION A,
         ESP_GENERIC_JOB B
    WHERE A.APPL_NAME = 'LELO'
      AND A.APPL_ID = B.APPL_ID
      AND B.JOB_NAME = 'UNIX0'
      AND B.JOB_QUALIFIER = ' '
      AND B.STATE = 'COMPLETE'
    ORDER BY B.END_DATE_TIME DESC
)
SELECT 
    START_DATE_TIME,
    END_DATE_TIME,
    
    -- Tempo em segundos (arredondado com 2 casas decimais)
    ROUND(segundos, 2) AS tempo_execucao_segundos,
    
    -- Formatação amigável: Xh Ymin Zs
    TRUNC(segundos / 3600) || 'h ' ||
    TRUNC(MOD(segundos, 3600) / 60) || 'min ' ||
    ROUND(MOD(segundos, 60), 2) || 's' AS tempo_formatado

FROM jobs;

 

Futuramente quando for usar na produção em Oracle, você altera esta linha:

substitua esta linha:

EXTRACT(EPOCH FROM (B.END_DATE_TIME - B.START_DATE_TIME)) AS segundos


 por esta:

(B.END_DATE_TIME - B.START_DATE_TIME) * 86400 AS segundos



Agora vamos analisar o erro que você apresentou:

 

 

18 horas atrás, Antonio Baptista disse:
ERRO:  função round(interval, integer) não existe
LINHA 8:     ROUND((END_DATE_TIME - START_DATE_TIME) * 86400, 2) AS t.


Isso acontece porque no PostgreSQL,  quando você faz (END_DATE_TIME - START_DATE_TIME), o resultado é um tipo INTERVAL (não um número).
Depois você multiplica por 86400, o PostgreSQL tenta fazer a multiplicação, mas o resultado ainda é interpretado como um interval ou double precision de forma que o ROUND(..., 2) não consegue resolver diretamente.
O PostgreSQL não tem uma função ROUND(interval, integer), ele tem ROUND(numeric, integer) e ROUND(double precision) (sem casas decimais).

Por que agora eu acho que usando ROUND() no novo exemplo pode funcionar?
Porque na versão que eu passei agora, eu primeiro converto o INTERVAL em um número de segundos usando:
 

EXTRACT(EPOCH FROM (END_DATE_TIME - START_DATE_TIME))

 

EXTRACT(EPOCH ...) retorna um double precision (número decimal) com os segundos totais.
Depois disso, ROUND(valor, 2) funciona bem (ou melhor ainda: ROUND(valor::numeric, 2) para maior precisão).

Em suma:  ROUND( (interval) * 86400 , 2) ocasionou o erro,  e  ROUND( EXTRACT(EPOCH FROM interval) , 2 ) foi usado para funcionar no PSQL. 

Então,  Se o novo código SQL não funcionar legal,  tem esta outra opção um pouco mais robusta, com o cálculo feito apenas uma vez (mais limpo e eficiente)
 

WITH jobs AS (
    SELECT 
        B.START_DATE_TIME,
        B.END_DATE_TIME,
        EXTRACT(EPOCH FROM (B.END_DATE_TIME - B.START_DATE_TIME)) AS segundos
    FROM ESP_APPLICATION A
    JOIN ESP_GENERIC_JOB B ON A.APPL_ID = B.APPL_ID
    WHERE A.APPL_NAME = 'LELO'
      AND B.JOB_NAME = 'UNIX0'
      AND B.JOB_QUALIFIER = ' '
      AND B.STATE = 'COMPLETE'
    ORDER BY B.END_DATE_TIME DESC
)
SELECT 
    START_DATE_TIME,
    END_DATE_TIME,
    
    -- Tempo em segundos arredondado com 2 casas
    ROUND(segundos::numeric, 2) AS tempo_execucao_segundos,
    
    -- Formatação amigável: Xh Ymin Zs
    TRUNC(segundos / 3600) || 'h ' ||
    TRUNC(MOD(segundos, 3600) / 60) || 'min ' ||
    ROUND(MOD(segundos, 60)::numeric, 2) || 's' AS tempo_formatado

FROM jobs;


Por fim, quando for rodar no Oracle, troque apenas a linha do cálculo:
 

(B.END_DATE_TIME - B.START_DATE_TIME) * 86400 AS segundos

O resto do SELECT (TRUNC, MOD, ROUND) fica idêntico...   Novamente, não vou garantir que realmente irão funcionar. Pois não há como eu testar isso. 
Desculpe se o post ficou enorme e cheio de explicações e exemplos.  Mas o fórum é exatamente para esta finalidade,  apresentar o problema, e analisar e tentar resolver.   Não sou expert no assunto e nem domino,  precisei fazer bastante pesquisa antes de responder para você. 

Espero que a resposta seja de alguma ajuda! 👍

Postado

@DiF Bom dia , muito obrigado pela ajuda deu certo.

 

Abco

 

    start_date_time     |     end_date_time      | tempo_execucao_segundos | tempo_formatado
------------------------+------------------------+-------------------------+-----------------
 2026-04-07 13:52:13.65 | 2026-04-07 13:52:43.66 |                   30.01 | 0h 0min 30.01s
 2026-04-07 13:51:43.4  | 2026-04-07 13:52:13.41 |                   30.01 | 0h 0min 30.01s
 2026-04-07 13:51:13.05 | 2026-04-07 13:51:43.06 |                   30.01 | 0h 0min 30.01s
 2026-04-07 13:50:42.83 | 2026-04-07 13:51:12.84 |                   30.01 | 0h 0min 30.01s
 2026-04-07 13:50:12.52 | 2026-04-07 13:50:42.54 |                   30.02 | 0h 0min 30.02s
 2026-04-07 13:49:42.25 | 2026-04-07 13:50:12.27 |                   30.02 | 0h 0min 30.02s
 2026-04-07 13:49:11.91 | 2026-04-07 13:49:41.92 |                   30.01 | 0h 0min 30.01s
 2026-04-07 10:07:14.96 | 2026-04-07 10:07:44.97 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:54:31.28 | 2026-04-06 21:55:01.28 |                   30.00 | 0h 0min 30.00s
 2026-04-06 21:39:56.16 | 2026-04-06 21:40:26.16 |                   30.00 | 0h 0min 30.00s
 2026-04-06 21:38:52.66 | 2026-04-06 21:39:22.67 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:38:11.84 | 2026-04-06 21:38:41.85 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:34:46.06 | 2026-04-06 21:35:16.08 |                   30.02 | 0h 0min 30.02s
 2026-04-06 21:34:18.75 | 2026-04-06 21:34:48.76 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:32:18.25 | 2026-04-06 21:32:48.27 |                   30.02 | 0h 0min 30.02s
 2026-04-06 21:31:47.99 | 2026-04-06 21:32:18    |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:30:49.67 | 2026-04-06 21:31:19.69 |                   30.02 | 0h 0min 30.02s
 2026-04-06 21:30:09.38 | 2026-04-06 21:30:39.39 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:29:29.35 | 2026-04-06 21:29:59.37 |                   30.02 | 0h 0min 30.02s
 2026-04-06 21:28:49.52 | 2026-04-06 21:29:19.53 |                   30.01 | 0h 0min 30.01s
 2026-04-06 21:28:12.08 | 2026-04-06 21:28:42.08 |                   30.00 | 0h 0min 30.00s
 2026-04-06 21:26:39.81 | 2026-04-06 21:27:09.83 |                   30.02 | 0h 0min 30.02s
 2026-03-26 16:03:15.08 | 2026-03-26 16:03:45.11 |                   30.03 | 0h 0min 30.03s
 2026-03-26 14:22:57.23 | 2026-03-26 14:23:27.24 |                   30.01 | 0h 0min 30.01s
 2026-03-26 08:00:30.02 | 2026-03-26 08:01:30.04 |                   60.02 | 0h 1min 0.02s
 2026-03-26 07:40:55.69 | 2026-03-26 07:41:55.73 |                   60.04 | 0h 1min 0.04s
 2026-03-25 23:26:24.65 | 2026-03-25 23:27:24.66 |                   60.01 | 0h 1min 0.01s
 2026-03-25 23:23:19.86 | 2026-03-25 23:24:19.88 |                   60.02 | 0h 1min 0.02s
 2026-03-25 23:20:26.98 | 2026-03-25 23:21:26.98 |                   60.00 | 0h 1min 0.00s
 2026-03-25 22:46:41.1  | 2026-03-25 22:47:41.12 |                   60.02 | 0h 1min 0.02s
 2026-03-25 22:42:28.04 | 2026-03-25 22:43:28.05 |                   60.01 | 0h 1min 0.01s
 2026-03-25 22:37:55.22 | 2026-03-25 22:38:55.23 |                   60.01 | 0h 1min 0.01s
 2026-03-25 22:17:45.63 | 2026-03-25 22:18:45.64 |                   60.01 | 0h 1min 0.01s
 2026-03-25 22:06:36.87 | 2026-03-25 22:07:16.88 |                   40.01 | 0h 0min 40.01s
 2026-03-25 22:01:08.35 | 2026-03-25 22:01:48.36 |                   40.01 | 0h 0min 40.01s
 2026-03-25 21:59:38.34 | 2026-03-25 22:00:18.34 |                   40.00 | 0h 0min 40.00s
 2026-03-25 21:56:14.78 | 2026-03-25 21:56:54.78 |                   40.00 | 0h 0min 40.00s
 2026-03-25 19:35:00.24 | 2026-03-25 19:39:00.25 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:30:00.24 | 2026-03-25 19:34:00.25 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:25:00.2  | 2026-03-25 19:29:00.21 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:20:00.26 | 2026-03-25 19:24:00.28 |                  240.02 | 0h 4min 0.02s
 2026-03-25 19:15:01.4  | 2026-03-25 19:19:01.41 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:10:00.31 | 2026-03-25 19:14:00.32 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:05:00.21 | 2026-03-25 19:09:00.22 |                  240.01 | 0h 4min 0.01s
 2026-03-25 19:00:00.25 | 2026-03-25 19:00:00.25 |                    0.00 | 0h 0min 0.00s
 2026-03-25 18:50:00.24 | 2026-03-25 18:50:00.24 |                    0.00 | 0h 0min 0.00s
 2026-03-25 18:45:00.28 | 2026-03-25 18:45:00.28 |                    0.00 | 0h 0min 0.00s
--Mais--

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...