PDA

Ver la Versión Completa : diferencia de campos hora y almacenarlo en hora


gonza_619
03-12-2010, 21:32:53
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 (http://www.clubdelphi.com/foros/showthread.php?t=11041)]. 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

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:

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.


...
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:

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. :)