Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle数据库中如何划分小时_Sql_Oracle - Fatal编程技术网

Sql Oracle数据库中如何划分小时

Sql Oracle数据库中如何划分小时,sql,oracle,Sql,Oracle,我有以下问题,但我有一个小问题 ... 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 ... 之所以会发生这种情况,是因为经过的时间是所有查询的总和,并且该值大于24小时 我如何划分值 如果需要,这里有两个查询,一个是关于所有已用时间的查

我有以下问题,但我有一个小问题

...
    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
...  
之所以会发生这种情况,是因为经过的时间是所有查询的总和,并且该值大于24小时

我如何划分值

如果需要,这里有两个查询,一个是关于所有已用时间的查询,另一个是有问题的查询,有问题的查询是执行平均值的查询

--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
/

注意:如果可能的话,我希望以小时而不是秒为单位计算平均时间,如上面的查询。

为什么要将微秒转换为日期,然后再转换回秒

我认为以下查询将满足您的要求:


干杯

为什么要将微秒转换为日期,然后再转换回秒

我认为以下查询将满足您的要求:


干杯

V$SQL视图中列“已用时间”的数据类型为数字。也许数据类型更适合您的要求?是的,此列以微秒为单位存储时间,是否有其他列为v$sql以间隔数据类型存储此值?我没有找到它。V$SQL视图中列“已用时间”的数据类型是数字。也许数据类型更适合您的要求?是的,此列以微秒为单位存储时间,是否有其他列为v$sql以间隔数据类型存储此值?我没有找到它
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
/