Subtrair Data e Hora
Senhores Bom dia, estou enfrentando um problema em subtrair horas e nem com a pesquisa do Forum que tem muitos posts sobre o Assunto.
Tenho uma Tabela com 4 Campos sendo:
Data_Entrada
Hora_entrada
Data_Saida
Hora_Saida
POis bem preciso saber quantas horas se passaram entre a Data e hora de entrada e a data e hora da Saida, pensei em armazenar data e Hora no mesmo campo porém estes dados são informado pelo usuario então achei melhor colocar em campo separado, alguém poderia me ajudar a resolver esta dúvida?
Um abraço
Tenho uma Tabela com 4 Campos sendo:
Data_Entrada
Hora_entrada
Data_Saida
Hora_Saida
POis bem preciso saber quantas horas se passaram entre a Data e hora de entrada e a data e hora da Saida, pensei em armazenar data e Hora no mesmo campo porém estes dados são informado pelo usuario então achei melhor colocar em campo separado, alguém poderia me ajudar a resolver esta dúvida?
Um abraço
Ariovaldo
Curtidas 0
Respostas
Ariovaldo
04/07/2005
Pessoal Desculpem faltou informação
Uso delphi 7.0 com Firebird 1.5
Uso delphi 7.0 com Firebird 1.5
GOSTEI 0
Cabelo
04/07/2005
Você usa assim...
declare 2 variáveis..
data_hora_entrada, data_hora_saida : TDateTime;
depois no evento específico de sua aplicação..
dê um select na base dos 4 campos..
depois some a data de enytrada com a hora de entrada e armazene em : data_hora_entrada.
depois some a data de saída com a hora de saída e armazene em : data_hora_saída.
o resultado será uma variável menos a outra..
se quiser pode usar assim :
Resultado := (cdsData.fieldbyname(´CAMPO_DATA_SAIDA´).asdatetime + cdsData.fieldbyname(´CAMPO_HORA_SAIDA´).asdatetime) - (cdsData.fieldbyname(´CAMPO_DATA_ENTRADA´).asdatetime + cdsData.fieldbyname(´CAMPO_HORA_ENTRADA´).asdatetime));
declare 2 variáveis..
data_hora_entrada, data_hora_saida : TDateTime;
depois no evento específico de sua aplicação..
dê um select na base dos 4 campos..
depois some a data de enytrada com a hora de entrada e armazene em : data_hora_entrada.
depois some a data de saída com a hora de saída e armazene em : data_hora_saída.
o resultado será uma variável menos a outra..
se quiser pode usar assim :
Resultado := (cdsData.fieldbyname(´CAMPO_DATA_SAIDA´).asdatetime + cdsData.fieldbyname(´CAMPO_HORA_SAIDA´).asdatetime) - (cdsData.fieldbyname(´CAMPO_DATA_ENTRADA´).asdatetime + cdsData.fieldbyname(´CAMPO_HORA_ENTRADA´).asdatetime));
GOSTEI 0
Ariovaldo
04/07/2005
Senhores fiz conforme fui informado, so que agora cai em outra situação, Na medida em atinge as 24:00 ele Zera o valor das horas e soma um na Data, como poderia fazer para converter este valor [b:d02b6d306d]31/12/1899 01:30:00[/b:d02b6d306d] em horas que na verdade seria 25:30 minutos?
procedure TForm1.Button1Click(Sender: TObject);
Var
DT_Entr, Hr_Entr, DT_Sai, Hr_Sai, data_hora_entrada, data_hora_saida, Total : TDateTime;
begin
Dt_Entr := strtoDate(´04/07/2005´);
Hr_Entr := StrToTime(´08:00:00´);
Dt_Sai := strtoDate(´05/07/2005´);
Hr_Sai := StrToTime(´09:30:00´);
data_hora_entrada := Dt_Entr + Hr_Entr;
data_hora_saida := Dt_Sai + Hr_Sai;
Total := data_hora_saida - data_hora_entrada;
[b:d02b6d306d]Edit1.text := DatetimetoStr(Total);[/b:d02b6d306d]
end;
[b:d02b6d306d]31/12/1899 01:30:00[/b:d02b6d306d]
procedure TForm1.Button1Click(Sender: TObject);
Var
DT_Entr, Hr_Entr, DT_Sai, Hr_Sai, data_hora_entrada, data_hora_saida, Total : TDateTime;
begin
Dt_Entr := strtoDate(´04/07/2005´);
Hr_Entr := StrToTime(´08:00:00´);
Dt_Sai := strtoDate(´05/07/2005´);
Hr_Sai := StrToTime(´09:30:00´);
data_hora_entrada := Dt_Entr + Hr_Entr;
data_hora_saida := Dt_Sai + Hr_Sai;
Total := data_hora_saida - data_hora_entrada;
[b:d02b6d306d]Edit1.text := DatetimetoStr(Total);[/b:d02b6d306d]
end;
[b:d02b6d306d]31/12/1899 01:30:00[/b:d02b6d306d]
GOSTEI 0
Cabelo
04/07/2005
Senhores fiz conforme fui informado, so que agora cai em outra situação, Na medida em atinge as 24:00 ele Zera o valor das horas e soma um na Data, como poderia fazer para converter este valor [b:c1cccf0bc8]31/12/1899 01:30:00[/b:c1cccf0bc8] em horas que na verdade seria 25:30 minutos?
procedure TForm1.Button1Click(Sender: TObject);
Var
DT_Entr, Hr_Entr, DT_Sai, Hr_Sai, data_hora_entrada, data_hora_saida, Total : TDateTime;
begin
Dt_Entr := strtoDate(´04/07/2005´);
Hr_Entr := StrToTime(´08:00:00´);
Dt_Sai := strtoDate(´05/07/2005´);
Hr_Sai := StrToTime(´09:30:00´);
data_hora_entrada := Dt_Entr + Hr_Entr;
data_hora_saida := Dt_Sai + Hr_Sai;
Total := data_hora_saida - data_hora_entrada;
[b:c1cccf0bc8]Edit1.text := DatetimetoStr(Total);[/b:c1cccf0bc8]
end;
[b:c1cccf0bc8]31/12/1899 01:30:00[/b:c1cccf0bc8]
Colega..
Na verdade um valor de TDateTime não passa de um valor extended.. portanto é bem simples..
Pegue o resultado na variável Total, sem formatar string e divida por 24, o resultado será um valor decimal..
aí você pode utilizar os dados inteiros como valor de horas.. certo...
o valor decimal voê terá os minutos..
divida por 60 terá o valor dos minutos..
em uma variável string mostre assim :
Hora_Total : string;
Hora_Total := FormatFloat(´0´, Round(Total / 24) + ´:´ + FormatFloat(´00´,
Frac(Total / 60);
GOSTEI 0