Translate

martes, 26 de noviembre de 2013

SQL Server: Manejar time mayores de 24horas

La idea es, tengo un programa donde controlo las sesiones de entrenamiento de una persona. Necesito obtener el total de distancia y tiempo recorrido por el atleta.

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;

La consulta necesaria y que usa el procedimiento anterior sería:

use TrainIT;
declare @userID bigInt;
set @userID=85;
       declare @totTime float;
       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: