Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Sumar Horas (https://www.clubdelphi.com/foros/showthread.php?t=52621)

BuenaOnda 26-01-2008 01:32:22

Sumar Horas
 
Hola amigos foreros:

Junto con saludarlos, quisiera que me ayudaran con "problemilla" que tengo, resulta que tengo que sacar las horas extras realizadas por un empleado en un mes y para ellos debo sumar las horas extras trabajadas, alguien me podría decir como puedo hacer esto:

Código SQL [-]
  
 01:25:00
 03:20:00
 02:00:00
---------
 06:45:00

desde ya, muchas gracias por su ayuda..:)

Caral 26-01-2008 01:45:26

Hola
Me parece, segun entiendo, que estos datos están en una tabla, si es asi por que no usar una sentencia sql?.
Saludos

BuenaOnda 26-01-2008 02:05:14

eso intente, pero me da error, ademas hice lo siguiente..

Código SQL [-]
 
Declare @Fecha as smalldatetime
Declare @FechaM as smalldatetime
--Sacamos la Maxima Fecha Actual...
  Set @Fecha=(Select Max(FechaControl)
                From Control)    
--Obtenemos la Fecha de 4 meses Atraz...     
  Set @FechaM=(DATEADD(mm, -4, @Fecha) ) 

--select @FechaM as max

Select Tiempo.div,Tiempo.DivName,Semana=dbo.ObtenerSemana(Tiempo.FechaControl),
       Times=CONVERT(DATETIME, 
       CONVERT (CHAR (3), SUM (DATEPART(MINUTE, Tiempo.TCD )) / 60 + SUM (DATEPART(HOUR, Tiempo.TCD)) ) + ':' + 
       CONVERT (CHAR (3), SUM (DATEPART(minute, Tiempo.TCD )) + (SUM(DATEPART(second, Tiempo.TCD))/60) % 60)+ ':' +
       CONVERT (CHAR (3), SUM (DATEPART(second, Tiempo.TCD )) % 60)), Anio=0
  From(Select a1.div,DivName=Case a1.div When 42 Then 'MENDOZA'
                                         When 43 Then 'CORDOVA'     
                                         When 44 Then 'BUENOS AIRES' End,    
              A1.LocName as Origen, A.LocOrigen,A2.LocName as Destino, A.LocDestino,A.HrEntrada,A.HrSalida,A.FechaControl ,
              TCD=cast( (A.HrSalida - A.HrEntrada) as datetime)--,
              --TCD=left(convert(varchar,(A.HrSalida - A.HrEntrada), 108), 8)
         From Control A
        Inner Join LocNames  As A1
           On A1.Loc=A.LocOrigen 
        Inner Join LocNames  As A2
           On A2.Loc=A.LocDestino
        Where A.FechaControl >=@FechaM) Tiempo 
  Group By Tiempo.div,Tiempo.DivName,dbo.ObtenerSemana(Tiempo.FechaControl)

eso funciona bien, pero cuando la cantidad de minutos es sobrepasada, osea la suma de minutos es superior a 60, arroja error...

Muchas gracias por tu ayuda..:)

Caral 26-01-2008 02:41:12

Hola
La verdad no entiendo.
El empleado ingresa la hora de entrada y la hora de salida en la tabla?.
Si es asi uno supondria que hay una hora predeterminada de entrada y otra de salida.
Por ejemplo:
la hora de entrada es 7 am
La hora de salida almuerzo es 12 m
La hora de entrada es 1 pm
La hora de salida es 5 pm
Esto nos da parametros.
Si el empleado entra a las 7 am y sale a almorzar a las 12.30 pm ya tiene 30 minutos de extras, pero su entra a su vez a la 1.30 pm y salio a las 5 pm, entonces cumplio con su horario.
No se, me parece que depende de como se esten colocando los datos y que tipo de datos se colocan en la tabla, el resto es hacer unas sumas y restas sencillas.
Bueno, es lo que me pareceria mas logico y por supuesto mas sencillo.
La verdad no entiendo bien el concepto de lo que estas haciendo.
Saludos

Lepe 26-01-2008 02:55:02

Aparte del buen apunte de Caral, lo mejor en estos casos es pasar todo a segundos, sumar y por último volver a pasar a formato hh:nn:ss

Saludos

BuenaOnda 26-01-2008 03:05:59

es verdad..
 
disculpa caral, por no haber explicado la consulta Sql, lo que pasa es que de esa manera estoy calculando un control de flota de camiones, era solo para mostrar la manera en la que he estado sumando Horas..:o, ahora voy a intentarlo convirtiendo las horas a segundos y luego sumarlas..gracias por tu ayuda..

BuenaOnda 26-01-2008 03:10:54

Asi es Lepe, eso voy a hacer convertir todo a segundos y luego convertir, nuevamente, a formato de hora.

BuenaOnda 26-01-2008 04:12:03

Solucionado..
 
solucione mi problema. converti todo a segundos y luego formatee la hora de la siguiente manera.

funcion.
Código SQL [-]
CREATE FUNCTION [dbo].[FormatHora] 
(@Segundos float) 
RETURNS varchar(50) AS 
BEGIN 
        DECLARE @RES VARCHAR(50) 
        DECLARE @HORAS FLOAT 
        DECLARE @MINS FLOAT 
        DECLARE @SEGS FLOAT 
        DECLARE @RESTO FLOAT 

        SET @HORAS = @Segundos /60/60 
        SET @RESTO = @HORAS - FLOOR(@HORAS) 
        --LISTO HORAS 
        SET @HORAS = FLOOR(@HORAS) 

        SET @MINS = @RESTO * 60 
        SET @RESTO = @MINS - FLOOR(@MINS) 
        --LISTO MINS 
        SET @MINS = FLOOR(@MINS) 

        SET @SEGS = @RESTO * 60 

        SET @RES = CAST(@HORAS as varchar) + ':' + right('00'+cast(@MINS as 
varchar),2) + ':' + right('00'+cast(@segs as varchar),2) 
        RETURN @RES 
END

Utilizando la conulta anterior..
Código SQL [-]
Declare @Fecha as smalldatetime
Declare @FechaM as smalldatetime
--Sacamos la Maxima Fecha Actual...
  Set @Fecha=(Select Max(FechaControl)
                From Control)    
--Obtenemos la Fecha de 4 meses Atraz...     
  Set @FechaM=(DATEADD(mm, -4, @Fecha) ) 
Select Tiempo.div,Tiempo.DivName,Semana=dbo.ft_ieo_ObtenerSemana(Tiempo.FechaControl),
       Times=dbo.FormatHora( SUM(DATEDIFF(s, CAST('00:00:00'AS datetime), CAST(Tiempo.TCD as datetime)))) , 
       Anio=0
  From(Select a1.div,DivName=Case a1.div When 42 Then 'MENDOZA'
                                         When 43 Then 'CORDOVA'     
                                         When 44 Then 'BUENOS AIRES' End,    
              A1.LocName as Origen, A.LocOrigen,A2.LocName as Destino, A.LocDestino,A.HrEntrada,A.HrSalida,A.FechaControl ,
              TCD=cast( (A.HrSalida - A.HrEntrada) as datetime)--,
              --TCD=left(convert(varchar,(A.HrSalida - A.HrEntrada), 108), 8)
         From Control A
        Inner Join LocNames  As A1
           On A1.Loc=A.LocOrigen 
        Inner Join LocNames  As A2
           On A2.Loc=A.LocDestino
        Where A.FechaControl >=@FechaM) Tiempo 
  Group By Tiempo.div,Tiempo.DivName,dbo.ft_ieo_ObtenerSemana(Tiempo.FechaControl)

muchas gracias por su ayuda..


La franja horaria es GMT +2. Ahora son las 17:21:49.

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