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
  

Mensagemem Sex, 08 Jan 2010 1:08 pm

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.

Código: Selecionar todos
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;
/
mateustads
Localização: MS

Mateus Leonardi

Mensagemem Sex, 12 Mar 2010 3:20 pm

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.
huntersc
Localização: FLORIANOPOLIS - SC

Mensagemem Ter, 21 Dez 2010 8:47 am

Ok
Peguei essa código

Código: Selecionar todos
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.
priajf
Localização: Florianopolis

Priscila Fernandes

Mensagemem Ter, 21 Dez 2010 9:06 am

Explica melhor a tua situação.

Tu tem uma tabela com hora inicial e final e quer ver o que passou de 12 min??
SergioLBJr
Localização: Parobé - RS

Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Mensagemem Qui, 15 Set 2016 11:10 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.
Victor_Ni

Mensagemem Sex, 16 Set 2016 7:42 am

Bom dia Victor,

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


Código: Selecionar todos
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;
/
spernega
Localização: São Paulo - SP

Mensagemem Sáb, 17 Set 2016 6:04 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.
Victor_Ni

Mensagemem Sáb, 17 Set 2016 7:04 pm

Boa noite Victor,

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

Em horas ou minutos, é só multiplicar as variáveis.
spernega
Localização: São Paulo - SP


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem
cron