Calculo de horas entre duas datas/horas

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
mateustads
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Sex, 08 Jan 2010 8:24 am
Localização: MS
Mateus Leonardi

não deu certo esse seu esquema... =X

no fim das contas acabei bolando uma fuction pra isso... curta e funcional... dêem uma olhada.

Selecionar tudo

CREATE OR REPLACE function SEMASA.f_tempo_media ( day_fraction NUMBER)
return char
is

 Years        NUMBER;
 months       NUMBER;
 days         NUMBER;
 hrs          NUMBER;
 mints        NUMBER;
 sec          NUMBER;

begin

 hrs   :=trunc(day_fraction*24);
 mints :=trunc((((day_fraction)*24)-(hrs))*60);
 sec   :=trunc(mod((day_fraction)*86400,60));

 return(LPAD (hrs, 2, '0') ||':'|| LPAD (mints, 2, '0') ||':'|| LPAD (sec, 2, '0'));

end;
/
huntersc
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Sex, 12 Mar 2010 3:11 pm
Localização: FLORIANOPOLIS - SC

Caros,

Estava vendo os selects anteriores e não consegui achar um resultado para o meu.

Estou precisando encontrar um horario vago para agendar atendimento.
Minha aplicação existe uma tabela onde tem os horarios Agendados.
Data/Hora inicio (DHPREVISTA) Data/Hora Fim TEMPPRIVISTO.

Ex: Tenho Agendado horarios:
08:00 - 09:00 11:00 - 12:00
Preciso que o select retorne o horario q tem vago das 10 as 11
Tudo isso levando em consideração horario das 8 as 12 das 13:30 as 18:00 somente durante dia de semana e limite entre horarios de 60 minutos.

Agradeço a colaboração.

Obrigado.
priajf
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 297
Registrado em: Ter, 21 Dez 2010 8:45 am
Localização: Florianopolis
Priscila Fernandes

Ok
Peguei essa código

Selecionar tudo

SELECT TO_CHAR ( (datahorainicio + INTERVAL || ''' ||tempo || ''' || MINUTE), 'HH24:mi:ss')
FROM
(SELECT datahorainicio,
        TO_CHAR ( ROUND (   (   (datahorafim - datahorainicio) * 1440)  )) AS tempo
FROM atendimento); 
POrem agora preciso fazer uma pesquisa com horarios que passaram de 12 min. Como faço. tempo nã oexiste na tabela.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Explica melhor a tua situação.

Tu tem uma tabela com hora inicial e final e quer ver o que passou de 12 min??
Victor_Ni
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 15 Set 2016 10:51 pm

Saudações. há tempos vejo que existem muitos técnicos com a mesma questão, "como calcular o tempo entre duas datas?", somente para recapitular. não se trata de calcular o tempo entre uma data e a data atual (sysdate), pois seria simples utilizando da função timestamp do Oracle.
Sem saber mais detalhes, muito s perguntam: Pra saber o tempo decorrido entre datas?
existem vários motivos. ainda mais para um DBA, Monitoramento de processos seria a resposta mais adequada para esta questão.

Agora na pratica, aguem conseguiu com exatidão criar um script que funcione 100%?

Isto não e um desafio, eu so não quero ser repetitivo em opções de solução.

abraços.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Bom dia Victor,

Tem uma função que eu criei e que está funcionando bem.
Pelo menos até agora não peguei nenhum erro.

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;
/
Victor_Ni
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 15 Set 2016 10:51 pm

Boa tarde, spernega.

Sua função ficou boa. mais simples do que a solução que desenvolvi.

vou fazer mais teste nesta sua função.

Obrigado.
spernega
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Ter, 19 Jun 2007 2:12 pm
Localização: São Paulo - SP

Boa noite Victor,

Boa sorte, adapte o retorno do jeito que você precisar.

Em horas ou minutos, é só multiplicar as variáveis.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante