Jump to content
Fórum Script Brasil
  • 0

Somar Horas


.: Thiago Rocha :.
 Share

Question

Boa tarde galera !!!

Estou com o seguinte problema.

estou trabalhando com Delphi e banco de dados Firebird, e agora cheguei num ponto aqui do sistema que preciso fazer um calculo de horas, como o exemplo abaixo:

Hora de Entrada: 08:00:00

Hora de Saida : 12:00:00

ou seja, se eu fizer a Hora de Saida e subtrair pela hora de entrada, terei um intervalo de 4 horas.

feito isso, depois preciso fazer mais uns calculos aqui, mas tudo gira em torno disso.

Então minha maior duvida é o seguinte, como eu posso fazer ou via delphi, ou via select para subtrair essa hora ou seja, pra mim fazer a hora de saida menos a hora de entrada, pois o campo é um timestamp, ou seja grava a informação como por exemplo '07/07/2007 08:00:00' então se fizer um menos o outro não vai funcionar devido a data, como devo proceder?

Caso alguém não entendeu o que quis dizer, é só perguntar.

Agradeço dese já.

Muito Atenciosamente

Thiago

Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 0
Guest --HDELPHI --
Boa tarde galera !!!

Estou com o seguinte problema.

estou trabalhando com Delphi e banco de dados Firebird, e agora cheguei num ponto aqui do sistema que preciso fazer um calculo de horas, como o exemplo abaixo:

Hora de Entrada: 08:00:00

Hora de Saida : 12:00:00

ou seja, se eu fizer a Hora de Saida e subtrair pela hora de entrada, terei um intervalo de 4 horas.

feito isso, depois preciso fazer mais uns calculos aqui, mas tudo gira em torno disso.

Então minha maior duvida é o seguinte, como eu posso fazer ou via delphi, ou via select para subtrair essa hora ou seja, pra mim fazer a hora de saida menos a hora de entrada, pois o campo é um timestamp, ou seja grava a informação como por exemplo '07/07/2007 08:00:00' então se fizer um menos o outro não vai funcionar devido a data, como devo proceder?

Caso alguém não entendeu o que quis dizer, é só perguntar.

Agradeço dese já.

Muito Atenciosamente

Thiago

Diferença entre duas horas

function DifHora(Inicio,Fim : String):String;
{Retorna a diferença entre duas horas}
var
  FIni,FFim : TDateTime;
begin
Fini := StrTotime(Inicio);
FFim := StrToTime(Fim);
If (Inicio > Fim) then
  begin
  Result := TimeToStr((StrTotime('23:59:59')-Fini)+FFim)
  end
else
  begin
  Result := TimeToStr(FFim-Fini);
  end;
end;

Quando é calculado com a diferença de 24 horas o resultado é sempre xx:59:59, portanto para que o resultado seja arredondado, é só acrescentar + StrToTime('00:00:01) conforme abaixo.

Result := TimeToStr((StrTotime('23:59:59') + StrToTime('00:00:01') -Fini)+FFim

espero que possar ajudar.

Link to comment
Share on other sites

  • 0
estou trabalhando com Delphi e banco de dados Firebird, e agora cheguei num ponto aqui do sistema que preciso fazer um calculo de horas, como o exemplo abaixo:

Hora de Entrada: 08:00:00

Hora de Saida : 12:00:00

ou seja, se eu fizer a Hora de Saida e subtrair pela hora de entrada, terei um intervalo de 4 horas.

feito isso, depois preciso fazer mais uns calculos aqui, mas tudo gira em torno disso.

Então minha maior duvida é o seguinte, como eu posso fazer ou via delphi, ou via select para subtrair essa hora ou seja, pra mim fazer a hora de saida menos a hora de entrada, pois o campo é um timestamp, ou seja grava a informação como por exemplo '07/07/2007 08:00:00' então se fizer um menos o outro não vai funcionar devido a data, como devo proceder?

Se o campo é timestamp, funciona sim. Vai depender do que você pretende fazer com ele.

Por exemplo, se eu tiver a data/hora final e inicial como segue:

DT_INICIO = 02/07/2007 15:30:00

DT_FIM = 06/07/2007 15:50:09

valor esperado: 4 dias, 20 minutos e 9 segundos

utilizando o cálculo direto no SQL eu obtenho:

VL_DECORRIDO = 4,013993055

Como chegar ao esperado:

note que são 4 dias e 0,013993055 horas onde cada valor inteiro corresponde a 24:00 (um dia), certo.

então, se multiplicar 0,013993055 por 24, você deverá obter o total de horas a que corresponde: 24 * 0,013993055 = 0,33583332;

No resultado você nota que tem 0 horas (parte inteira) + 0,33583332 de uma hora, ou seja 60 minutos. Então, novamente você multiplica e terá o tempo em minutos: 60 * 0,33583332 = 20,1499992;

No resultado você já vê que tem 20 minutos + 0,1499992 de um minuto, ou seja 60 segundos. Novamente você multiplica e terá o tempo em segundos: 60 * 0,1499992 = 8,999952;

O que temos denovo? 8 segundos e 0,999952 de um segundo, ou seja 1000 mili-segundos. Mas se não precisar da precisão é só parar por aqui e arredondar os 8,999952 para ter 9 segundos.

este foi o exemplo "forçado" que crie no IBExpert para testar - note que eu simplesmente subtrai um timestamp do outro:

select cast('now' as timestamp) DT_FIM, cast('07-02-2007 15:30' as timestamp) DT_INICIO, (cast('now' as timestamp) - cast('07-02-2007 15:30' as timestamp)) VL_DECORRIDO

from pessoa

where cod_pessoa = 1

deve ser utilizada uma tabela para que o select funcione - eu usei uma das minhas.

Abraços

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...