Cálculo Média de Tempo em Query

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
silvadouglas
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qua, 13 Jun 2018 2:25 pm

Prezados boa tarde.

Tenho uma query que utilizo em um painel de indicadores do sistema do hospital em que trabalho onde os usuários responsáveis solicitaram um alteração onde se inclua uma média nos tempos conforme o andamento do atendimento dos pacientes. A query utilizada atualmente é esta abaixo:

Selecionar tudo

SELECT
    TA.DS_SENHA             SENHA_PACIENTE          ,
    CASE WHEN   A.CD_ATENDIMENTO    IS  NULL    THEN    TA.NM_PACIENTE  ELSE    P.NM_PACIENTE   END NOME_PACIENTE           ,
    TO_DATE(TA.DH_PRE_ATENDIMENTO               ,               'DD/MM/RRRR')                       DATA_RETIRADA_SENHA     ,
    TO_CHAR(TA.DH_PRE_ATENDIMENTO               ,               'HH24:MI:SS')                       HORA_SENHA              ,
    TO_DATE(TA.DH_CHAMADA_CLASSIFICACAO         ,               'DD/MM/RRRR')                       CHAMADA_TRIAGEM         ,
    TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO         ,               'HH24:MI:SS')                       HORA_TRIAGEM            ,
    TA.CD_TRIAGEM_ATENDIMENTO NUM_TRIAGEM       ,
    CASE WHEN   TA.DH_REMOVIDO      IS  NULL    THEN    'N'     ELSE    'S'     END                 TRIAGEM_REMOVIDA        ,
    TO_DATE(TA.DH_PRE_ATENDIMENTO_FIM           ,               'DD/MM/RRRR')                       FIM_TRIAGEM             ,
    TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM           ,               'HH24:MI:SS')                       HORA_FIM_TRIAGEM        ,
    TO_DATE(A.HR_ATENDIMENTO                    ,               'DD/MM/RRRR')                       DATA_ATENDIMENTO        ,
    TO_CHAR(A.HR_ATENDIMENTO                    ,               'HH24:MI:SS')                       HORA_ATENDIMENTO        ,
    A.CD_ATENDIMENTO                                                                                NUM_ATENDIMENTO         ,
    TO_DATE(MIN(PW.DH_CRIACAO)                  ,               'DD/MM/RRRR')                       CHAMADA_MEDICO          ,
    TO_CHAR(MIN(PW.DH_CRIACAO)                  ,               'HH24:MI:SS')                       HORA_CHAMADA            ,
    TO_DATE(A.DT_ALTA                           ,               'DD/MM/RRRR')                       DATA_ALTA               ,
    TO_CHAR(A.DT_ALTA                           ,               'HH24:MI:SS')                       HORA_ALTA               ,
    SR.NM_COR                                   ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_SENHA_TRIAGEM      ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_FIM_TRIAGEM        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  ,           11,9    )   TEMPO_TRIAGEM_ATENDIMENTO,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  - 
                    TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  ,           11,9    )   TEMPO_CHAMADA_MEDICO     , 
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  - 
                    TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  ,           11,9    )   TEMPO_FIM_CHAMADA        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_TRIAGEM_CHAMADA    ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_TOTAL_ATENDIMENTO             
                    
FROM        DBAMV.TRIAGEM_ATENDIMENTO       TA 
   LEFT     JOIN    DBAMV.ATENDIME          A   ON  A.CD_ATENDIMENTO        =   TA.CD_ATENDIMENTO   AND A.TP_ATENDIMENTO    =   'U'
   LEFT     JOIN    DBAMV.PACIENTE          P   ON  A.CD_PACIENTE           =   P.CD_PACIENTE
   LEFT     JOIN    PW_DOCUMENTO_CLINICO    PW  ON  A.CD_ATENDIMENTO        =   PW.CD_ATENDIMENTO
   LEFT     JOIN    SACR_COR_REFERENCIA     SR  ON  TA.CD_COR_REFERENCIA    =   SR.CD_COR_REFERENCIA
WHERE 
    ((TRUNC(A.DT_ATENDIMENTO)       >   =   '04/04/2017'    AND TRUNC   (A.DT_ATENDIMENTO)      <   =   '04/04/2017'    OR 
    ((TRUNC(TA.DH_PRE_ATENDIMENTO)  >   =   '04/04/2017'    AND TRUNC   (TA.DH_PRE_ATENDIMENTO) <   =   '04/04/2017'    )
    AND TA.CD_FILA_SENHA    =   1   ))      AND
    CASE    WHEN    TA.DH_REMOVIDO      IS  NULL    THEN    'N' ELSE    'S' END IN  'N' )
GROUP BY
    A.CD_ATENDIMENTO                ,
    A.HR_ATENDIMENTO                ,
    TA.DS_SENHA                     ,
    A.DT_ALTA                       ,
    CASE    WHEN    A.CD_ATENDIMENTO    IS  NULL    THEN    TA.NM_PACIENTE  ELSE    P.NM_PACIENTE   END     ,
    TA.CD_TRIAGEM_ATENDIMENTO       ,
    TA.DH_PRE_ATENDIMENTO           ,
    TA.DH_PRE_ATENDIMENTO_FIM       ,
    TA.DH_CHAMADA_CLASSIFICACAO     ,
    CASE    WHEN    TA.DH_REMOVIDO      IS  NULL    THEN    'N'             ELSE    'S'             END     ,
    SR.NM_COR
ORDER BY NOME_PACIENTE;
Percebam que os tempos de atendimento estão representados da query como tempo2 - tempo1:

Selecionar tudo

    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_SENHA_TRIAGEM      ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_FIM_TRIAGEM        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO_FIM,'dd/mm/yyyy hh24:mi:ss'  ))  ,           11,9    )   TEMPO_TRIAGEM_ATENDIMENTO,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  - 
                    TO_TIMESTAMP(TO_CHAR(A.HR_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'           ))  ,           11,9    )   TEMPO_CHAMADA_MEDICO     , 
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  - 
                    TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  ,           11,9    )   TEMPO_FIM_CHAMADA        ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(MIN(PW.DH_CRIACAO),'dd/mm/yyyy hh24:mi:ss'         ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss'))  ,           11,9    )   TEMPO_TRIAGEM_CHAMADA    ,
    SUBSTR      (   TO_TIMESTAMP(TO_CHAR(A.DT_ALTA,'dd/mm/yyyy hh24:mi:ss'                  ))  - 
                    TO_TIMESTAMP(TO_CHAR(TA.DH_PRE_ATENDIMENTO,'dd/mm/yyyy hh24:mi:ss'      ))  ,           11,9    )   TEMPO_TOTAL_ATENDIMENTO 
Para cada etapa no atendimento será necessário calcular a média do tempo decorrido entre cada uma das etapas representadas no código acima mas não estou sabendo montar o calculo da media tendo em vista que o comando AVG retorna erro.

Vocês poderiam me ajudar?

Agradeço desde já!
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa,
1)
Não entendo o porquê de fazer isso:
TO_TIMESTAMP(TO_CHAR(TA.DH_CHAMADA_CLASSIFICACAO,'dd/mm/yyyy hh24:mi:ss')) se TA.DH_CHAMADA_CLASSIFICACAO possui data e hora. Está fazendo conversões à toa que atrapalham o tempo e visualização.

2)
Sobre cálculo em cima de horas e diferenças :
http://glufke.net/oracle/viewtopic.php? ... A7a#p32892
e
http://glufke.net/oracle/viewtopic.php? ... A7a#p33353

Qualquer dúvida ainda é só falar.
Responder
  • Informação