Как разделить час в Oracle База данных - PullRequest
1 голос
/ 22 января 2020

У меня следующий запрос, но у меня есть небольшая проблема

...
    trunc(to_char(to_date(elapsed_time,'hh24:mi:ss'),'sssss')/EXECUTIONS,2)

        ERROR at line 2:
        ORA-01850: hour must be between 0 and 23
...  

Это происходит потому, что elapsed_time представляет собой сумму всех запросов, а значение превышает 24 ч.

Как Могу ли я разделить значение?

Если вам нужно, вот два запроса, один для всех elapsed_time, а другой - запрос с проблемой, запрос с проблемой - это запрос, который получает среднее значение при выполнении

--TOP QUERIES COM MAIOR ELAPSED_TIME
set pagesize 0 embedded on;
set linesize 3000;
col FIRST_LOAD_TIME for a20;
col LAST_LOAD_TIME for a20;
col EXECUTIONS for a10;
COL sql_id for a20;
col FETCHES for a10;
col PARSE_CALLS for a15;
col elapsed_time for a20;
SELECT * FROM
(SELECT
    sql_id,
    TO_CHAR(TRUNC((elapsed_time/1000000)/3600),'FM9900') || ':' ||
    TO_CHAR(TRUNC(MOD((elapsed_time/1000000),3600)/60),'FM00') || ':' ||
    TO_CHAR(MOD((elapsed_time/1000000),60),'FM00') AS elapsed_time, --ESSE CAMPO É A SOMA DE TODO O TEMPO DE ESPERA, NAO DE APENAS UMA EXECUCAO
    child_number,
    disk_reads,
    to_char(executions) as executions,
    to_char(FETCHES) as FETCHES,
    to_char(PARSE_CALLS) as PARSE_CALLS,
    first_load_time,
    last_load_time
FROM    gv$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10 ---top 10
/

Запрос, который я хочу построить по среднему времени:

--MEDIA ELAPSED_TIME POR EXECUCAO
set pagesize 0 embedded on;
set linesize 3000;
col FIRST_LOAD_TIME for a20;
col LAST_LOAD_TIME for a20;
col EXECUTIONS for a10;
COL sql_id for a20;
col FETCHES for a10;
col PARSE_CALLS for a15;
col TOTAL_ELAPSED_TIME_SECS for a40;
SELECT sql_id,elapsed_time,to_char(to_date(elapsed_time,'hh24:mi:ss'),'sssss') "TOTAL_ELAPSED_TIME_SECS",
EXECUTIONS,trunc(to_char(to_date(elapsed_time,'hh24:mi:ss'),'sssss')/EXECUTIONS,2) "AVG_TIME_BY_EXECUTION_SEC" FROM
(SELECT
    sql_id,
    TO_CHAR(TRUNC((elapsed_time/1000000)/3600),'FM9900') || ':' ||
    TO_CHAR(TRUNC(MOD((elapsed_time/1000000),3600)/60),'FM00') || ':' ||
    TO_CHAR(MOD((elapsed_time/1000000),60),'FM00') AS elapsed_time, --ESSE CAMPO É A SOMA DE TODO O TEMPO DE ESPERA, NAO DE APENAS UMA EXECUCAO
    to_char(EXECUTIONS) as EXECUTIONS
FROM    gv$sql
ORDER BY elapsed_time DESC)
WHERE ROWNUM < 10 ---top 10
/

Примечание: Если возможно, я бы хотел, чтобы среднее время в часах а не секунды, как в приведенном выше запросе.

1 Ответ

3 голосов
/ 22 января 2020

Почему вы конвертируете microseconds в date, а затем снова обратно в seconds?

Я думаю, следующий запрос удовлетворит ваше требование:

SELECT
    SQL_ID,
    ELAPSED_TIME_CHAR, --change here
    TRUNC(ELAPSED_TIME, 2)   AS "TOTAL_ELAPSED_TIME_SECS", --change here
    EXECUTIONS,
    TRUNC(ELAPSED_TIME / EXECUTIONS, 2) "AVG_TIME_BY_EXECUTION_SEC" --change here
FROM
    (
        SELECT
            SQL_ID,
            ELAPSED_TIME / 1000000 AS ELAPSED_TIME, --change here
            TO_CHAR(TRUNC((ELAPSED_TIME / 1000000) / 3600), 'FM9900')
            || ':' || TO_CHAR(TRUNC(MOD((ELAPSED_TIME / 1000000), 3600) / 60), 'FM00')
            || ':' || TO_CHAR(MOD((ELAPSED_TIME / 1000000), 60), 'FM00') AS ELAPSED_TIME_CHAR, 
            TO_CHAR(EXECUTIONS) AS EXECUTIONS
        FROM GV$SQL
        ORDER BY ELAPSED_TIME DESC
    )
WHERE ROWNUM < 10 ---top 10
/

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...