Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Acumular Horas en sql Server 2000

Estas en el tema de Acumular Horas en sql Server 2000 en el foro de SQL Server en Foros del Web. Hola que tal como están, mis más cordiales saludos a todos los del foro, bueno quería comentarles que estoy haciendo una tabla donde se ponga ...
  #1 (permalink)  
Antiguo 23/04/2008, 09:38
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 2
Acumular Horas en sql Server 2000

Hola que tal como están, mis más cordiales saludos a todos los del foro, bueno quería comentarles que estoy haciendo una tabla donde se ponga horas de entrada y salida a mi trabajo, algo así:

AGOSTO
Mañanas: Entrada: 08:40 am
Salida : 14:00 pm

Tardes: Entrada: 16:00 pm
Salida: 18:30 pm

Y así sucesivamente durante todo el mes, y que al ir poniéndose las horas de entrada y salida, se vaya acumulando las horas trabajadas en otro campo
ejemplo:
Mañanas: Entrada: 08:40 am
Salida : 14:00 pm
y en el campo que acumula , guarde 6 horas y 40 minutos .
La verdad no se si hay una funcion o una formula oara sacar este calculo, espero que me ayuden .

Estoy ocupando sql server 2000
  #2 (permalink)  
Antiguo 23/04/2008, 09:49
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Acumular Horas en sql Server 2000

mmmmmmmmmmmmm, tanto como acumularlas, como tienes UN REGISTRO por cada evento, lo veo dificil, incluso por un campo calculado.

Alguna vez tuve la necesidad de hacer algo asi y tuve que hacer SUBQUERYS de Entrada y Salida, agrupando por empleado y dia, de esa forma con un simple DATEDIFF, podrias sacar el resultado, el problema con el que te vas a encontrar, es cuando un empleado, registre por ejemplo su ENTRADA, no asi su salida o por el contrario, no registre ENTRADA y si su SALIDA.

Sin conocer la estructura de tu tabla, es lo que te puedo comentar.

Saludos
  #3 (permalink)  
Antiguo 23/04/2008, 11:00
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 2
Re: Acumular Horas en sql Server 2000

Cita:
Iniciado por iislas Ver Mensaje
mmmmmmmmmmmmm, tanto como acumularlas, como tienes UN REGISTRO por cada evento, lo veo dificil, incluso por un campo calculado.

Alguna vez tuve la necesidad de hacer algo asi y tuve que hacer SUBQUERYS de Entrada y Salida, agrupando por empleado y dia, de esa forma con un simple DATEDIFF, podrias sacar el resultado, el problema con el que te vas a encontrar, es cuando un empleado, registre por ejemplo su ENTRADA, no asi su salida o por el contrario, no registre ENTRADA y si su SALIDA.

Sin conocer la estructura de tu tabla, es lo que te puedo comentar.

Saludos
gracias , igual lo veo un poco complicado , el Datediff funciona con las horas sin ningun problema pero no funciona con los minutos .
  #4 (permalink)  
Antiguo 23/04/2008, 12:50
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Acumular Horas en sql Server 2000

Claro que si......un DATEDIFF(mi, HoraIni, HoraFin), debe darte la diferencia en MINUTOS, claro que si hay mas de 60, pues te dara los minutos que haya de diferencia.
  #5 (permalink)  
Antiguo 23/04/2008, 13:17
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 2
Re: Acumular Horas en sql Server 2000

Cita:
Iniciado por iislas Ver Mensaje
Claro que si......un DATEDIFF(mi, HoraIni, HoraFin), debe darte la diferencia en MINUTOS, claro que si hay mas de 60, pues te dara los minutos que haya de diferencia.
sorry, ya entendi la forma en como se ocupa el datediff en los minutos hay una forma de acumular los minutos ejemplo:
tengo Hora1 09:20 - Hora2 14:35 y que el resultado sea 55

Última edición por punkser69; 23/04/2008 a las 13:27
  #6 (permalink)  
Antiguo 23/04/2008, 13:37
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Acumular Horas en sql Server 2000

¿De donde sacas que la diferencia entre las 09:20 y las 14:35 son solo 55 minutos?

Si solo en horas son 5 horas !!!
  #7 (permalink)  
Antiguo 23/04/2008, 15:15
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 2
Re: Acumular Horas en sql Server 2000

Cita:
Iniciado por iislas Ver Mensaje
¿De donde sacas que la diferencia entre las 09:20 y las 14:35 son solo 55 minutos?

Si solo en horas son 5 horas !!!
Ya se eso solo lo decia por los minutos ya que 35+20=55 por eso lo decia
ya que estaba pensando hacerlos por separado(hora por un lado y minutos por otro lado) pero si hay una forma de que salga el resultudo altiro o sea

09:20 - 14:35 = 5:55
me gustarias que me ayudaras

Gracias
  #8 (permalink)  
Antiguo 23/04/2008, 17:18
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Acumular Horas en sql Server 2000

Revisa tu calculo, porque a menos que esta funcion esta mal, el resultado correcto es: 5:15

-- Funcion que calcula las diferencias de horario correctamente

IF OBJECT_ID('dbo.fn_datediff', 'FN') IS NOT NULL
DROP FUNCTION dbo.fn_datediff;
GO
CREATE FUNCTION dbo.fn_datediff
(@from_ts AS DATETIME, @to_ts AS DATETIME) RETURNS VARCHAR(24)
AS
BEGIN
RETURN
(
SELECT
CASE sgn WHEN 1 THEN '+' WHEN -1 THEN '-' END +
RIGHT('000' + CAST(y AS VARCHAR(4)), 4) + '-' +
RIGHT('0' + CAST(m AS VARCHAR(2)), 2) + '-' +
RIGHT('0' + CAST(d AS VARCHAR(2)), 2) + ' ' +
RIGHT('0' + CAST(h AS VARCHAR(2)), 2) + ':' +
RIGHT('0' + CAST(mi AS VARCHAR(2)), 2) + ':' +
RIGHT('0' + CAST(s AS VARCHAR(2)), 2) + '.' +
RIGHT('00' + CAST(ms AS VARCHAR(3)), 3)
FROM
(
SELECT from_ts, to_ts, sgn, y, m, d,
s / 3600 AS h,
s % 3600 / 60 AS mi,
s % 60 AS s,
(1000 + DATEPART(ms, to_ts) - DATEPART(ms, from_ts)) % 1000 AS ms
FROM
(
SELECT from_ts, to_ts, sgn,
y,
m - DATEDIFF(month, from_ts, y_ts) AS m,
d - DATEDIFF(day, from_ts, m_ts) AS d,
DATEDIFF(second, d_ts, to_ts) -
CASE
WHEN DATEPART(ms, to_ts) < DATEPART(ms, from_ts) THEN 1
ELSE 0
END AS s
FROM
(
SELECT *,
DATEADD(year, y, from_ts) AS y_ts,
DATEADD(month, m, from_ts) AS m_ts,
DATEADD(day, d, from_ts) AS d_ts
FROM
(
SELECT from_ts, to_ts, sgn,
y - CASE WHEN DATEADD(year, y, from_ts) > to_ts
THEN 1 ELSE 0 END AS y,
m - CASE WHEN DATEADD(month, m, from_ts) > to_ts
THEN 1 ELSE 0 END AS m,
d - CASE WHEN DATEADD(day, d, from_ts) > to_ts
THEN 1 ELSE 0 END AS d
FROM
(
SELECT *,
DATEDIFF(year, from_ts, to_ts) AS y,
DATEDIFF(month, from_ts, to_ts) AS m,
DATEDIFF(day, from_ts, to_ts) AS d
FROM
(
SELECT
CASE WHEN from_ts <= to_ts THEN from_ts ELSE to_ts END AS from_ts,
CASE WHEN from_ts <= to_ts THEN to_ts ELSE from_ts END AS to_ts,
CASE WHEN from_ts <= to_ts THEN 1 WHEN to_ts < from_ts THEN -1 END AS sgn
FROM
(
SELECT @from_ts AS from_ts, @to_ts AS to_ts
) AS D0
) AS D1
) AS D2
) AS D3
) AS D4
) AS D5
) AS D6
)
END
GO
  #9 (permalink)  
Antiguo 23/04/2008, 18:55
 
Fecha de Ingreso: enero-2008
Mensajes: 68
Antigüedad: 16 años, 3 meses
Puntos: 2
Re: Acumular Horas en sql Server 2000

Cita:
Iniciado por iislas Ver Mensaje
Revisa tu calculo, porque a menos que esta funcion esta mal, el resultado correcto es: 5:15

-- Funcion que calcula las diferencias de horario correctamente

IF OBJECT_ID('dbo.fn_datediff', 'FN') IS NOT NULL
DROP FUNCTION dbo.fn_datediff;
GO
CREATE FUNCTION dbo.fn_datediff
(@from_ts AS DATETIME, @to_ts AS DATETIME) RETURNS VARCHAR(24)
AS
BEGIN
RETURN
(
SELECT
CASE sgn WHEN 1 THEN '+' WHEN -1 THEN '-' END +
RIGHT('000' + CAST(y AS VARCHAR(4)), 4) + '-' +
RIGHT('0' + CAST(m AS VARCHAR(2)), 2) + '-' +
RIGHT('0' + CAST(d AS VARCHAR(2)), 2) + ' ' +
RIGHT('0' + CAST(h AS VARCHAR(2)), 2) + ':' +
RIGHT('0' + CAST(mi AS VARCHAR(2)), 2) + ':' +
RIGHT('0' + CAST(s AS VARCHAR(2)), 2) + '.' +
RIGHT('00' + CAST(ms AS VARCHAR(3)), 3)
FROM
(
SELECT from_ts, to_ts, sgn, y, m, d,
s / 3600 AS h,
s % 3600 / 60 AS mi,
s % 60 AS s,
(1000 + DATEPART(ms, to_ts) - DATEPART(ms, from_ts)) % 1000 AS ms
FROM
(
SELECT from_ts, to_ts, sgn,
y,
m - DATEDIFF(month, from_ts, y_ts) AS m,
d - DATEDIFF(day, from_ts, m_ts) AS d,
DATEDIFF(second, d_ts, to_ts) -
CASE
WHEN DATEPART(ms, to_ts) < DATEPART(ms, from_ts) THEN 1
ELSE 0
END AS s
FROM
(
SELECT *,
DATEADD(year, y, from_ts) AS y_ts,
DATEADD(month, m, from_ts) AS m_ts,
DATEADD(day, d, from_ts) AS d_ts
FROM
(
SELECT from_ts, to_ts, sgn,
y - CASE WHEN DATEADD(year, y, from_ts) > to_ts
THEN 1 ELSE 0 END AS y,
m - CASE WHEN DATEADD(month, m, from_ts) > to_ts
THEN 1 ELSE 0 END AS m,
d - CASE WHEN DATEADD(day, d, from_ts) > to_ts
THEN 1 ELSE 0 END AS d
FROM
(
SELECT *,
DATEDIFF(year, from_ts, to_ts) AS y,
DATEDIFF(month, from_ts, to_ts) AS m,
DATEDIFF(day, from_ts, to_ts) AS d
FROM
(
SELECT
CASE WHEN from_ts <= to_ts THEN from_ts ELSE to_ts END AS from_ts,
CASE WHEN from_ts <= to_ts THEN to_ts ELSE from_ts END AS to_ts,
CASE WHEN from_ts <= to_ts THEN 1 WHEN to_ts < from_ts THEN -1 END AS sgn
FROM
(
SELECT @from_ts AS from_ts, @to_ts AS to_ts
) AS D0
) AS D1
) AS D2
) AS D3
) AS D4
) AS D5
) AS D6
)
END
GO
Gracias, mañana voy a revisar tu codigo y te cuento como me fue
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:31.