Ir para conteúdo
Fórum Script Brasil
  • 0

Somar Horas


.: Thiago Rocha :.

Pergunta

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 para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...