Bueno me puse en la tarea de investigación, muy interesante como se manejan los campos time en Firebird. Lo primero es que la diferencia entre dos datos de tipo type es un decimal(9,4), segundo para hacer la conversion de una resta tipo time1 -time2 es que time1 debe ser mayor o igual a time2 para evitar problemas con una conversion de un resultado negativo.
Para mayor información de firebird comprense el libro "The Firebird Book (Second Edition): A Reference for Database Developers".
Me fue de utilidad este hilo
http://tech.groups.yahoo.com/group/f.../message/97350 el cual utilicé y modifiqué una parte para el procedimiento adjunto, debes hacer pruebas con datos que contegan milésimas porque no alcancé a hacer las pruebas con datos conteniendo milésimas.
Tal vez haya una función que maneje directamente lo que necesitas pero no encontré, el código adjunto espero sea de utilidad, si les sirve me deben una pola (cerveza).
Código SQL
[-]
SET TERM ^ ;
create or alter procedure SP_CLUB_DELPHI_01
as
declare variable CODIGO smallint;
declare variable TIEMPO_FINAL time;
declare variable TIEMPO_DIFERENCIA double precision;
declare variable HORAS smallint;
declare variable MINUTOS smallint;
declare variable SEGUNDOS smallint;
declare variable MILESIMAS smallint;
begin
for select registro.codigo,
tiempos.tiempo - categoria.restar
from registro
inner join categoria on (registro.grupo = categoria.idgrupo)
inner join tiempos on (registro.codigo = tiempos.codigo)
into :codigo,
:tiempo_diferencia
do begin
-- La diferencia de dos datos de tipo time es el numero de segundos
-- en formato deciamal(9,4), debe entonces hacerse la conversion
horas = cast ((tiempo_diferencia / 3600.0) as smallint);
tiempo_diferencia = tiempo_diferencia - (horas * 3600);
minutos = cast ((tiempo_diferencia / 60.0) as smallint);
tiempo_diferencia = tiempo_diferencia - (minutos * 60);
segundos = cast ((tiempo_diferencia ) as smallint);
tiempo_diferencia = tiempo_diferencia - (segundos );
milesimas = cast (tiempo_diferencia * 1000 as smallint);
tiempo_final = cast
(
cast(horas as varchar(2))
|| ':' || cast(minutos as varchar(2))
|| ':' || cast(segundos as varchar(2))
|| ':' || cast(milesimas as varchar(4))
as time
);
update registro
set registro.tiempo = :tiempo_final
where registro.codigo = :codigo;
end
end
^
SET TERM ; ^