Página 1 de 1

Auxílio em SQL para Relatório

Enviado: Seg, 29 Ago 2016 11:45 am
por jiopra
Tenho um sql aqui q é a base de um relatorio do meu sistema relacionado a tempo de espera de atendimentos médicos:

Selecionar tudo

 select	
	a.nr_atendimento,
substr(obter_min_entre_datas(a.dt_entrada, a.dt_atend_medico,null),1,50)  qt_tempo_espera,
substr(obter_min_entre_datas(a.dt_atend_medico, a.dt_fim_consulta, null),1,50) qt_temp_atend,
	substr(obter_nome_pf(a.cd_pessoa_fisica),1,50) nm_paciente,
	substr(obter_nome_pf(a.cd_medico_resp),1,50) nm_medico,
	a.dt_entrada,
	a.dt_inicio_atendimento,
	a.dt_fim_triagem,
	a.dt_alta,
	substr(obter_dif_data(a.dt_inicio_atendimento,a.dt_fim_triagem,null),1,20) teste,
	substr(obter_dif_data(a.dt_entrada,a.dt_alta,null),1,20) qt_tempo_atendimento

	from	atendimento_paciente a

where	a.dt_entrada between trunc(:dt_inicial) and fim_dia(:dt_final)
and	((:cd_setor_atendimento = obter_setor_atendimento(a.nr_atendimento)) or (:cd_setor_atendimento = '0'))
  order by
	a.dt_entrada
na coluna - qt_tempo_espera e na coluna qt_temp_atend, preciso realizar a soma dos minutos do relatorio e ao fim das colunas exibir um total dos minutos, como poderia fazer esse sum com as substr?

Re: Auxílio em SQL para Relatório

Enviado: Seg, 29 Ago 2016 2:25 pm
por spernega
Boa tarde,

Você pode tentar usar o extract (minute.

Já existem alguns tópicos aqui no forum.

Re: Auxílio em SQL para Relatório

Enviado: Qua, 31 Ago 2016 2:20 pm
por geovani
Opa!

Pelo que vi, você está usando uma função que calcula o tempo entre duas datas e retorna no formato de texto, e depois você quer somar esses dois tempos do tipo texto, é isso?

Para tomar o tempo total, porque você não usando essa função usando a.dt_entrada e a.dt_fim_consulta ?

exemplo:

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada, a.dt_fim_consulta,null),1,50) qt_tempo_total

Re: Auxílio em SQL para Relatório

Enviado: Qua, 31 Ago 2016 3:13 pm
por jiopra
Opa Geovani,

então mano é isso mesmo, preciso exibir a soma nas duas funções, fiz dessa forma porque preciso dos dados das duas colunas separas, a primeira exibe o tempo em minutos que o medico demorou para chamar a paciente desde sua entrada no hospital, e o outro exibe o tempo que o medico demorou para atender a paciente depois da chamada ate a hora da alta.

se puder se dar uma força em como posso fazer essa somatoria do total de cada coluna separado te agradeço, porque preciso exibir esses dados em uma reuniao dia 5/9

valeu abração.

Re: Auxílio em SQL para Relatório

Enviado: Qua, 31 Ago 2016 6:15 pm
por geovani
Veja se assim que você precisa:

Selecionar tudo

trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600) hora,
trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)) minuto,

lpad(trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600),2,0) ||':'||
lpad(trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)),2,0) hhmm

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 11:25 am
por jiopra
Bom dia Geovani,

apliquei o código em meu sql, porém não realizou a calculo total das colunas, acho que apliquei o código no lugar errado do sql, poderia me informar em qual parte do sql aplico a codificação, só para ver se eu apliquei no lugar certo.

Muito Obrigado

Abraço

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 11:41 am
por geovani
Basta incluir os campos abaixo, segue o código:

Selecionar tudo

select
	a.nr_atendimento,
	substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera,
	substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) qt_temp_atend,
	substr(obter_nome_pf(a.cd_pessoa_fisica),1,50) nm_paciente,
	substr(obter_nome_pf(a.cd_medico_resp),1,50) nm_medico,
	a.dt_entrada,
	a.dt_inicio_atendimento,
	a.dt_fim_triagem,
	a.dt_alta,
	substr(obter_dif_data(a.dt_inicio_atendimento,a.dt_fim_triagem,null),1,20) teste,
	substr(obter_dif_data(a.dt_entrada,a.dt_alta,null),1,20) qt_tempo_atendimento,
	trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600) hora,
	trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)) minuto,
	lpad(trunc((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/3600),2,0) ||':'||
    	lpad(trunc(mod(((((a.dt_atend_medico - a.dt_entrada) + (a.dt_fim_consulta - a.dt_atend_medico)) * 86400)/60),60)),2,0) hhmm    
from
	atendimento_paciente a    
where
	a.dt_entrada between trunc(:dt_inicial) and fim_dia(:dt_final)  
	and (:cd_setor_atendimento = obter_setor_atendimento(a.nr_atendimento) or :cd_setor_atendimento = '0')
order by
	a.dt_entrada

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 4:10 pm
por jiopra
eitaaa geovani

descobri o problema mano, o meu relatório só consegue somar valores numerics, por isso não está dando certo, preciso converter os valores das duas colunas

Selecionar tudo

   substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera,
   substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) qt_temp_atend,
para um valor numerico ai assim consigo faz o total, sabes como realizar essa mudança ? sei que o campo das data é date.

abraçãoo

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 4:27 pm
por geovani
Não estou entendo o que você precisa.

Essa função obter_min_entre_datas retorna em qual formato? se for numérico basta somar:

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) + 
substr(obter_min_entre_datas(a.dt_atend_medico,a.dt_fim_consulta,null),1,50) 

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 5:27 pm
por jiopra
Assim geovani, veja se isso é possivel,

Selecionar tudo

substr(obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null),1,50) qt_tempo_espera

essa função OBTER os dois campos que estou utilizando a.dt_entrada e a.dt_atend_medico ambos são do tipo DATE logo a coluna QT_TEMPO_ESPERA também é DATE, precisaria converter o dado antes de ser mostrado na coluna para tipo NUMBER que ai consigo realizar a soma da coluna toda pelo meu proprio gerenciador do relatorio do sistema.

conseguiu me entender?

kkkkk

Re: Auxílio em SQL para Relatório

Enviado: Qui, 01 Set 2016 5:57 pm
por geovani
Você tem certeza que o retorno é uma data? pelo nome da função parece que retorna um número, rsrsrs.

Passa a função para entendermos melhor.

Se retorna mesmo uma data, basta multiplicar por 86400 para converter em segundos.

Ex:

Selecionar tudo

obter_min_entre_datas(a.dt_entrada,a.dt_atend_medico,null) * 86400 qt_tempo_espera

Re: Auxílio em SQL para Relatório

Enviado: Sex, 02 Set 2016 7:31 am
por spernega
Bom dia,

Veja se esta função ajuda alguma coisa.

Selecionar tudo

create or replace 
function Fn_Intervalo_Tempo (P_Dt_Inic in date,
                             P_Dt_Fina in date) return varchar2 is
 v_inte  number;
 v_Hora  varchar2(200);
 --
 cursor c is
   SELECT lpad(   extract (day    from numtodsinterval(v_inte, 'day'))    ,5,' ') Qt_Dias,
          lpad(   extract (hour   from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Horas,
          lpad(   extract (minute from numtodsinterval(v_inte, 'day' ))   ,2,'0') Qt_Minutos,
          lpad(   extract (second from numtodsinterval(v_inte, 'day'))    ,2,'0') Qt_Segundos
   FROM   dual;
 c_r c%rowtype;
 --
begin
 --
 v_inte := trunc((p_dt_Fina - p_dt_Inic),6);
 dbms_output.put_line('v_inte     '||to_char(v_inte));
 --
 open c;
  fetch c into c_r;
   if c%found then
      --
      dbms_output.put_line('c_r.Qt_Dias     '||c_r.Qt_Dias);
      dbms_output.put_line('c_r.Qt_Horas    '||c_r.Qt_Horas);
      dbms_output.put_line('c_r.Qt_Minutos  '||c_r.Qt_Minutos);
      dbms_output.put_line('c_r.Qt_Segundos '||lpad(trunc(c_r.Qt_Segundos),2,'0'));
      --
      v_hora := c_r.Qt_Dias||' '||c_r.Qt_Horas||':'||c_r.Qt_Minutos||':'||lpad(trunc(c_r.Qt_Segundos),2,'0');
   end if;
 close c;
 return v_hora;
exception
 when others then
  return 'erro';
End;
/
Pra trazer o total em minutos precisa tratar os resultados.
Hora * 60
Dias * 1440

Re: Auxílio em SQL para Relatório

Enviado: Seg, 05 Set 2016 8:24 am
por jiopra
Pessoal agradeço pelas dicas, mas nada resolveu meu problema, vou tentar realizar de uma outra forma o ajuste.

obrigado

Re: Auxílio em SQL para Relatório

Enviado: Seg, 05 Set 2016 11:49 am
por geovani
jiopra,

Acho que não conseguimos porque não ficou claro exatamente o que você precisa, mas acredito que as dicas e funções passadas aqui você conseguirá.

Valeu!