PDA

Ver la Versión Completa : Sumar Horas


BuenaOnda
26-01-2008, 01:32:22
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:



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..



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
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
solucione mi problema. converti todo a segundos y luego formatee la hora de la siguiente manera.

funcion.

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..

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..