Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   diferencia de campos hora y almacenarlo en hora (https://www.clubdelphi.com/foros/showthread.php?t=71152)

gonza_619 03-12-2010 21:32:53

diferencia de campos hora y almacenarlo en hora
 
hola a todos, bien mi pregunta es que tengo dos campos hora y necesito hacer la diferencia entre ellas:
lo que hago es sacar en variables esos 2 campos y luego restarlos, pero me los devuelve en decimal, lo cual necesitaria que qedaran en tipo time, o pasar a time ese valor decimal.
Luego necesitaria saber como con consulta sql sumar un cmapo time y como me devolveria el resultado? gracias a todos
Bueno tambien quiero saber si al usar un hoursbetween entre dos campos time, por ej: 02:30:00 y 3:00:00 , el resultado seria 1? o me agrega los minutos?, como podria hacer para q me devuelva hora,min y seg para almacenarlo en campo time?gracias de nuevo

rgstuamigo 03-12-2010 22:31:49

Hola amigo(a) gonza_619, creo que debes de ser más específico(a) y detallista al postear tus dudas, por ejemplo debes comentar si estás usando alguna base de datos y en tal caso especificar cuál de todas?(MySQL,MS sql server,Oracle,PostGree,Firebird,etc):confused:
saludos...:)

gonza_619 03-12-2010 22:34:19

Perdon, estoy usando paradox y necesito hhacer la consulta en sql con query, para sumar campo tipo time, se que directamente no se podria
select sum(hora_entrada) as s from tabla..
como podria solucionarlo? gracias y perdon nuevamente

ecfisa 05-12-2010 09:38:45

Hola gonza.

Revisá este [ enlace ]. En el, roman pone un código de ejemplo para paradox que podés adaptar a tu caso.

Saludos. :)

gonza_619 05-12-2010 23:03:15

bien lo probe funciona muestra los segundos pero no sale el encodetime
Código Delphi [-]
query1.Close;
query1.SQL.Text:='select sum(3600*extract(hour from hora_ent) + 60*extract(minute from hora_ent) + extract(second from hora_ent)) as total from cursohs where curso=1';
query1.Open;
yy:=query1.fieldbyname('total').asinteger;
edit5.Text:=inttostr(yy);
H:=yy div 3600;
M:=(yy mod 3600) div 60;
S:=(yy mod 3600) mod 60;
time:= EncodeTime(H, M, S, 0);
edit5.Text:=timetostr(time);

bien lo quiero mostrar en un edit pero salta error en encodetime= invalid argument to time encode gracias

ecfisa 05-12-2010 23:57:05

Hola gonza.

Mirá, para sacarme la duda hice una tabla con un solo campo: 'Entrada' de tipo TTimeField.
Luego cargué aleatoriamente las horas con un for y probé el código puesto por roman. No obtuve ningún error.

Esta es la prueba que hice por si te ayuda en algo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  tt,h,m,s: Word;
  TotalEntrada: TTime;
begin
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT SUM( ');
  Query1.SQL.Add('3600*EXTRACT(HOUR FROM ENTRADA)+');
  Query1.SQL.Add('60*EXTRACT(MINUTE FROM ENTRADA)+');
  Query1.SQL.Add('EXTRACT(SECOND FROM ENTRADA)) ');
  Query1.SQL.Add('AS TOT_ENTRADA FROM PRUEBA');
  Query1.Open;
  tt:= Query1.FieldByName('TOT_ENTRADA').Value;
  h:=  tt div 3600;
  m:= (tt mod 3600) div 60;
  s:= (tt mod 3600) mod 60;
  TotalEntrada:= EncodeTime(h, m, s,0);
  Caption:= TimeToStr(TotalEntrada);
end;

Saludos. :)

gonza_619 06-12-2010 00:39:27

pues bien si salio bien, el problema es que suma la diferencia de horas, pero sirve. ahora tengo una consulta, bueno tengo almacenada horas pero en formato numerico en un campo es decir (1:30:00 = 1,5) bien necesitaria que el 1,5 se muestre como 1:30 al hacer una suma de esa columna numerica, es decir volverlo a tipo hora al resultado de la suma, si por ejemplo la suma da
tot= 20,5 que lo muestre en un edit.text=20:30, se podria? o como seria la cambio de formato? gracias espero puedan ayudarme

ecfisa 06-12-2010 01:51:03

Hola gonza.

Según creo querés pasar un tipo Real a TTime, al menos en Delphi 7 no conozco una función predeterminada para hacerlo.

Pero podés pasar todo a milisegundos y sacar hora, minuto y segundos y luego convertir con DecodeDate.

Código Delphi [-]
...
uses DateUtils;

function FloatToTime(Value: Extended): TTime;
var
  h,m,s,ms: Word;
  aux: Cardinal;
begin
  // a Cardinal
  aux:= Trunc(Value)*3600000 + Trunc(Frac(Value)*3600000); 
  // hora
  h:= aux div 3600000;
  Dec(aux, h * 3600000);
  // minutos
  m:= aux div 60000;
  Dec(aux, m * 60000);
  // segundos
  s:= aux div 1000;
  Dec(aux, s * 1000);
  // a Time
  Result:= EncodeTime(h,m,s,0);
end;

Ejemplo de llamada:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
   ShowMessage(TimeToStr(FloatToTime(10.551))); // 10:33:06 a.m.
end;


Los milisegundos no los consideré, supongo que para horarios de entrada/salida no serán significantes.
Aunque lo podés implementar ampliando un poco el código.

Saludos. :)


La franja horaria es GMT +2. Ahora son las 17:00:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi