Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como determinar Minutos y Segundos Exactos en Firebird???? (https://www.clubdelphi.com/foros/showthread.php?t=53434)

AGAG4 20-02-2008 20:45:55

Como determinar Minutos y Segundos Exactos en Firebird????
 
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:

Código SQL [-]
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

Cita:

Empezado por AGAG4 (Mensaje 267358)
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?

Código:

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

Cita:

Empezado por egostar (Mensaje 267361)
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

Cita:

Empezado por Lepe (Mensaje 267417)
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

Gabriel 21-02-2008 23:40:10

Tambien con campos calculados
 
Código:

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


La franja horaria es GMT +2. Ahora son las 20:14:34.

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