Con los datos de tipo time no puedo controlar más de 24horas. Si bién las sesiones son siempre muy inferoiores a 24horas, al sumarlas si se nos presenta el problema. Para resolverlo, ántes de sumar el tiempo de cada sesión los transformamos a float para sumarlos todos. Obtenemos un float que tiene la suma total, y luego con un procedimiento que crearemos en la BD podremos transformar a formato hhhh:mm:ss de manera que así ya podamos mostrarlo.
El procedure sería así:
@timeAsFloat es el float de entrada que contiene la suma de tiempos, y @totTimeVC será el resultado en formato varchar conteniendo el tiempo total.
create procedure [dbo].[floatToTime] @timeAsFloat float, @totTimeVC varchar(14) output
as
declare @h int;
declare @m int;
declare @s int;
set @h=CAST(@timeAsFloat/3600 as int);
set @m=CAST( (CAST(@timeAsFloat as Int)%3600)/60 as int);
set @s=(CAST(@timeAsFloat as Int)%3600)%60;
declare @mVC varchar(2);
declare @sVC varchar(2);
set @mVC=Convert(varchar(2),@m);
set @sVC=Convert(varchar(2),@s);
if LEN(@mVC)=1
begin
set @mVC=’0′+@mVC;
end;
if LEN(@sVC)=1
begin
set @sVC=’0′+@sVC;
end;
set @totTimeVC=Convert(varchar(8),@h)+’:'+@mVC+’:'+@sVC;
use TrainIT;
declare @userID bigInt;
set @userID=85;
declare @totTime float;declare @userID bigInt;
set @userID=85;
set @totTime=(select SUM(CAST(Time As Float)*24*60*60) from Sessions where UserID=@userID);
declare @totTimeVC varchar(14);
execute floatToTime @totTime,@totTimeVC output;
select COUNT(SessionID) as SesionsCant,
SUM(Distance) as TotDist,
CAST(AVG(Distance)as decimal(7,2)) as AvgDist,
MAX(Distance) as MaxDist,
@totTimeVC As TotTimeCalc,
from Sessions
where UserID=@userID;
No hay comentarios:
Publicar un comentario