PDA

Ver la Versión Completa : Como determinar Minutos y Segundos Exactos en Firebird????


AGAG4
20-02-2008, 20:45:55
Como se darán cuenta ando lidiando con los campos TIME en firebird, estoy haciendo un select de los retardos en horas, minutos y segundos de los empleados , pero veo que no me da exacto el dato, por ejemplo, les añado el siguiente Select, donde intento decifrar , cuanto tiempo en Horas y Minutos exacto pudiera tener X empleado:


SELECT C.CVEEMPLEADO,
CASE WHEN
(Cast('08:00:00' as TIME) - MIN(C.HORA)) / 60 BETWEEN -60 AND -0.01
THEN
( (Cast('08:00:00' as TIME) - MIN(C.HORA)) / 60 * (0-1)) ||' Mins.'
ELSE
CASE WHEN
((Cast('08:00:00' as TIME) - MIN(C.HORA)) / 60 ) < -60
THEN
(((Cast('08:00:00' as TIME) - MIN(C.HORA)) / 60 ) / 60 * (0-1) ) ||' Hrs.'
END RETARDO
....


Ejemplo1:
Si la hora de entrada son a las 8am y si X empleado checa a las 08:12:40 am
en la sentencia me desglosa el resultado = >>>> 12.6666 Mins.
en vez de mostrar 12.40 Mins

Ejemplo2:
Si la hora de entrada son a las 8am y si X empleado checa a las 09:40:00 am
en la sentencia me desglosa el resultado = >>>> 1.6777 Hrs.
en vez de mostrar 1.40 Hrs.

Agradezco cualquier sugerencia....

egostar
20-02-2008, 20:49:25
Ejemplo1:
Si la hora de entrada son a las 8am y si X empleado checa a las 08:12:40 am
en la sentencia me desglosa el resultado = >>>> 12.6666 Mins.
en vez de mostrar 12.40 Mins

Ejemplo2:
Si la hora de entrada son a las 8am y si X empleado checa a las 09:40:00 am
en la sentencia me desglosa el resultado = >>>> 1.6777 Hrs.
en vez de mostrar 1.40 Hrs.

Agradezco cualquier sugerencia....

Bueno hay que recordar que las horas son base 60, tal vez por eso tu confusion, no entiendo porque generas un resultado real (12.6666) en lugar del mismo formato de hora (12:40)

Salud OS

Al González
20-02-2008, 22:59:07
¡Hola a todos!

Opino lo mismo que Eliseo, Alfredo. Recuerda que lo normal de cualquier lenguaje de programación (incluyendo SQL), es tomar las operaciones matemáticas de suma, resta, multiplicación y división bajo un esquema de base decimal. No puedes esperar que Firebird convierta el resultado automáticamente a base 60.

Pero dicha conversión no tiene nada de ciencia, puedes hacerla tú mismo con una simple regla de tres. Si a 1 unidad de minuto le corresponden 60 segundos, ¿cuántos segundos corresponden a 0.6666 minutos?


1 0.6666
--- -------
60 ?


(0.6666 * 60) / 1

O lo que es lo mismo, 0.6666 * 60 = 39.996 (redondeado, 40 segundos).

Multiplica la fracción de minuto por 60 y obtendrás su representación en segundos. Multiplica la fracción de hora por 60 y obtendrás su representación en minutos.

Espero te sirva de algo.

Saludos.

Al.

AGAG4
21-02-2008, 00:34:32
Bueno hay que recordar que las horas son base 60, tal vez por eso tu confusion, no entiendo porque generas un resultado real (12.6666) en lugar del mismo formato de hora (12:40)

Salud OS

En primer lugar egostar, gracias por tu comentario, pero aclaro, YO NO GENERO EL RESULTADO firebird lo devuelve por lo que comenta Al, lo entiendo, solo que esa era mi duda del porque firebird devolvia .666 en vez de los .40, se supone que son campos TIME y no campos Flotantes que no ????, la verdad tengo escasos minutos de usar estos campos de tipo TIME, ignoraba el comportamiento pero ya me estoy familiarizando, por lo que veo todo va a pie en cuanto a resta y sumas de tiempos, tendre que hacer alguna UDF....

Gracias por sus sugerencias, que tengan buen día.

Lepe
21-02-2008, 00:39:47
Las Rfunc no te van a dar el resultado que quieres, pero ayudan bastante.

(En FB2 ya se han implementado algunas de las funciones de rfunc.)

Saludos

AGAG4
21-02-2008, 18:26:37
Las Rfunc no te van a dar el resultado que quieres, pero ayudan bastante.

(En FB2 ya se han implementado algunas de las funciones de rfunc.)

Saludos

Gracias LEPE, encontre unas UDF's que le dan muy buen tratamiento a los campos de tipo TIME, se llaman FreeAdhocUDFmin estas se encuentran en la pagina de www.ibexpert.com (http://www.ibexpert.com/)

Gabriel
21-02-2008, 23:40:10
procedure TFFullDiariDM.QHoresRCalcFields(DataSet: TDataSet);
var
TotalMinuts,Hores,Minuts : Integer;
begin
TotalMinuts := Round(SecondsBetween(QHoresRSurt.AsDateTime,QHoresREntra.AsDateTime)/60);
Hores := Trunc(TotalMinuts / 60);
Minuts := Trunc(TotalMinuts mod 60);
QHoresRHores.AsString := IntToStr(Hores) + ':' + FormatFloat('00',Minuts);
end;


Saludos