Pegar o intervalo em horas entre duas datas

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
gutoalex
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 10 Out 2011 12:54 pm

:D Amigos gostaria de uma ajudinha.
Preciso pegar o intervalo em horas entre dos campos timestemp
Exemplo:

Selecionar tudo

Data Inicial >= 01/09/2015 08:00:00
Data final  <=  01/09/2015 11:00:00
Resultado:

Selecionar tudo

01/09/2015 08:00:00
01/09/2015 09:00:00
01/09/2015 10:00:00
01/09/2015 11:00:00
é que preciso fazer a contagem de quantas salas cirurgicas estão sendo utilizadas no mesmo horário.
Ex. sala 1 --> Cir.Iniciada as 8 hrs e final as 11 hrs
sala 2 --> Cir.Iniciada as 9 hrs e final as 10 hrs.

Resultado --> sala 1 e sala 2 utilizadas no mesmo periodo nas horas 9 e 10.

Desde de já agradeço toda ajuda.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

gutoalex
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Seg, 10 Out 2011 12:54 pm

Obrigado pela ajuda Daniel.

Consegui resolver o problema parcialmente.
Utilizei "Conecty by level" mais estou tendo problemas de performance
as vezes uma consulta com 100 registros demora aproximadamente 9 minutos.
outras com o mesmo volume demoram segundos.
Devo estar fazendo algum agrupamento errado.

Selecionar tudo

select dtreal
     , hora
     , replace(wm_concat(dessc),',','  /  ')as salas
     , count(hora) total_salas
  from (select dtreal
             , hora
             , count (codsc) totsalcir
             , codsc
             , dessc
             , count(hora) total
          from (select distinct (atend)
                     , trunc(dtrealizado) dtreal
                     , horaini - 1 + level as hora
                     , codsc
                     , dessc
                     , horaini
                     , horafim
                  from ( select bb.cd_atendimento  atend
                              , bb.cd_sal_cir      codsc
                              , sc.ds_sal_cir      dessc
                              , bb.dt_realizacao   dtrealizado
                              , bb.dt_fim_limpeza
                              , substr((cast(bb.dt_fim_limpeza as timestamp) - cast(bb.dt_realizacao as timestamp)),12,2) ||':'||
                                substr((cast(bb.dt_fim_limpeza as timestamp) - cast(bb.dt_realizacao as timestamp)),15,2) ||':'||
                                substr((cast(bb.dt_fim_limpeza as timestamp) - cast(bb.dt_realizacao as timestamp)),18,2) as duracao
                              , to_char(bb.dt_realizacao, 'hh24') as  horaini
                              , to_char(bb.dt_fim_limpeza,'hh24') as  horafim
                           from dbamv.aviso_cirurgia bb
                              , dbamv.sal_cir sc
                          where bb.cd_sal_cir = sc.cd_sal_cir(+)
                            and bb.dt_realizacao between to_date ('10/07/2015 00:00:00','dd/mm/yyyy hh24:mi:ss')
                                                     and to_date ('10/07/2015 23:59:59','dd/mm/yyyy hh24:mi:ss')
                            and  bb.dt_cancelamento is null
                            and  bb.tp_situacao = 'R'
                          order
                            by  bb.dt_realizacao
                      )

               connect
                    by level <= horafim - horaini + 1
                 order
                    by atend
                     , hora
        )
        group
           by dtreal
            , hora
            , codsc
            , dessc
        order
           by dtreal
            , hora
            , codsc
            , dessc
     )
 group
    by  dtreal
     ,  hora
having count(hora) >= 2

order
   by  dtreal
    ,  hora
Resultado:

Selecionar tudo

DTREAL	HORA	SALAS	SALAS
08/07/2015	19	SALA 6 (CC II)  /  SALA 3 (CC II)	2
09/07/2015	15	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	16	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	17	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	18	SALA 4 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	19	SALA 4 (CC II)  /  SALA 7 (CC II)	2
08/07/2015	19	SALA 6 (CC II)  /  SALA 3 (CC II)	2
09/07/2015	15	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	16	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	17	SALA 6 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	18	SALA 4 (CC II)  /  SALA 7 (CC II)	2
09/07/2015	19	SALA 4 (CC II)  /  SALA 7 (CC II)	2
Renato Menezes Viana
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Sáb, 18 Nov 2006 11:51 am
Localização: Rio de Janeiro - RJ

Amigos, já faz muito tempo da dúvida, mas acho muito bom observar no link abaixo como ponto de partida de uma solução envolvendo datas:

http://glufke.net/oracle/viewtopic.php? ... 992#p38992

Abs, Renato Viana
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 18 visitantes