Buscar horas trabajadas en rangos

17/07/2008 - 10:12 por sqlTest | Informe spam
Hola,
tengo la tabla "TrabajoEmpleados" con la estructura siguiente:

CódigoEmpleado Fecha HoraEntrada HoraSalida
-
-

Por otro lado tengo todos los rangos de las horas de 1 dia como
5-6,6-7,...12-13,..23:0,..hasta 4-5

Bueno el tema es que necesito sumar el número de horas totales
trabajadas en un determinado rango pero después de realizar muchísimas
pruebas no doy con la solución ya que lo que me da más problemas es
cuando un empleado comienza en un dia (a las 23 pej)
horas) y finaliza al dia siguiente (a las 2 horas por ejemplo.

Cabe decir también que estoy utilizando sql-server 2005.

Muchísimas grácias por cualquier ayuda

Preguntas similare

Leer las respuestas

#11 Carlos M. Calvelo
18/07/2008 - 23:52 | Informe spam
Hola Alejandro,

On 18 jul, 23:12, Alejandro Mesa
wrote:
Que bueno que posteastes la estructura de las tablas y data de ejemplo.



Debería ser siempre así eh? :-)

Alejandro, excelente tu solución! Pero todavía tiene un problema.
Y es que para el rango 23-00 dá 0 pero tiene que ser 1.
Yo estoy teniendo exactamente el mismo problema, :-o vaya!!!
(haciendolo solo con sintaxis sql 2000) y no doy con ello!

Por hoy... ya lo dejo! :-(

Saludos,
Carlos
Respuesta Responder a este mensaje
#12 Alejandro Mesa
19/07/2008 - 00:08 | Informe spam
Carlos,

Debería ser siempre así eh? :-)



Asi es, pero eso no le ve quien esta de el otro lado.

Alejandro, excelente tu solución! Pero todavía tiene un problema.
Y es que para el rango 23-00 dá 0 pero tiene que ser 1.
Yo estoy teniendo exactamente el mismo problema, :-o vaya!!!
(haciendolo solo con sintaxis sql 2000) y no doy con ello!



Muy buena atrapada!!!

Eso se debe a que el rango es un poco raro 23 - 00, asi que le hice un
pequeño arreglo a la condicion de union entre la CTE y la tabla rangos.


ON b.h >= DATEPART(hour, r.[HORAINI])
AND b.h < ISNULL(NULLIF(DATEPART(hour, r.[HORAFIN]), 0), 24)


Ese es el unico rango que tiene hora cero a la derecha, asi que si esa hora
es cero, entonces devuelvo null y si es null devuelvo 24.


;WITH
L0 AS (SELECT 1 AS n UNION ALL SELECT 1),
L1 AS (SELECT 1 AS n FROM L0 AS a, L0 AS b),
L2 AS (SELECT 1 AS n FROM L1 AS a, L1 AS b),
L3 AS (SELECT 1 AS n FROM L2 AS a, L2 AS b),
L4 AS (SELECT 1 AS n FROM L3 AS a, L3 AS b),
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS n FROM L4),
[te]
AS
(
SELECT
a.[CODEMPLEADO],
a.[FECHA],
a.[HORAIN],
a.[HORAOUT],
DATEPART(hour, DATEADD(minute, b.n - 1, a.[HORAIN])) h
FROM
TRABAJOEMPLEADOS AS a
INNER JOIN
Nums AS b
ON b.n <= DATEDIFF(minute, a.HORAIN, a.HORAOUT)
)
SELECT
RIGHT('00' + DATENAME(hour, r.[HORAINI]), 2) + ' - ' + RIGHT('00' +
DATENAME(hour, r.[HORAFIN]), 2) AS rango,
COUNT(b.h) / 60.00 AS TotalHoras
FROM
[RANGOS] AS r
LEFT OUTER JOIN
te AS b
ON b.h >= DATEPART(hour, r.[HORAINI]) AND b.h <
ISNULL(NULLIF(DATEPART(hour, r.[HORAFIN]), 0), 24)
GROUP BY
r.[HORAINI],
r.[HORAFIN]
ORDER BY
r.[HORAINI],
r.[HORAFIN]
GO


AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 18 jul, 23:12, Alejandro Mesa
wrote:
> Que bueno que posteastes la estructura de las tablas y data de ejemplo.

Debería ser siempre así eh? :-)

Alejandro, excelente tu solución! Pero todavía tiene un problema.
Y es que para el rango 23-00 dá 0 pero tiene que ser 1.
Yo estoy teniendo exactamente el mismo problema, :-o vaya!!!
(haciendolo solo con sintaxis sql 2000) y no doy con ello!

Por hoy... ya lo dejo! :-(

Saludos,
Carlos

Respuesta Responder a este mensaje
#13 Alejandro Mesa
19/07/2008 - 00:11 | Informe spam
Carlos,

Para SS 2000, podemos crear una tabla de números y usar la misma logica de
expandir cada fila de acuerdo a los minutos trabajados.


AMB


"Carlos M. Calvelo" wrote:

Hola Alejandro,

On 18 jul, 23:12, Alejandro Mesa
wrote:
> Que bueno que posteastes la estructura de las tablas y data de ejemplo.

Debería ser siempre así eh? :-)

Alejandro, excelente tu solución! Pero todavía tiene un problema.
Y es que para el rango 23-00 dá 0 pero tiene que ser 1.
Yo estoy teniendo exactamente el mismo problema, :-o vaya!!!
(haciendolo solo con sintaxis sql 2000) y no doy con ello!

Por hoy... ya lo dejo! :-(

Saludos,
Carlos

Respuesta Responder a este mensaje
#14 sqlTest
19/07/2008 - 10:37 | Informe spam
Hola genios,
ante todo muchísimas grácias por vuestra ayuda.
En cuanto pueda lo pruebo y os digo algo.
Saludos y muchas grácias de nuevo.
Respuesta Responder a este mensaje
#15 Carlos M. Calvelo
19/07/2008 - 12:44 | Informe spam
Hola Alejandro,

On 19 jul, 00:08, Alejandro Mesa
wrote:
Carlos,

> Debería ser siempre así eh?  :-)

Asi es, pero eso no le ve quien esta de el otro lado.

> Alejandro, excelente tu solución! Pero todavía tiene un problema.
> Y es que para el rango 23-00 dá 0 pero tiene que ser 1.
> Yo estoy teniendo exactamente el mismo problema, :-o  vaya!!!
> (haciendolo solo con sintaxis sql 2000) y no doy con ello!

Muy buena atrapada!!!

Eso se debe a que el rango es un poco raro 23 - 00,



Exacto! El único rango con HORAINI > HORAFIN.

asi que le hice un
pequeño arreglo a la condicion de union entre la CTE y la tabla rangos.

ON b.h >= DATEPART(hour, r.[HORAINI])
AND b.h < ISNULL(NULLIF(DATEPART(hour, r.[HORAFIN]), 0), 24)



Aun así, si cambio (por ejemplo) los rangos

23:00-00:00
00:00-01:00

por uno solo:

23:00-01:00

ya no funciona (da 0 horas en ese rango).

Con:

ON b.h >= DATEPART(hour, r.[HORAINI])
AND b.h < DATEPART(hour, r.[HORAFIN]) +
CASE WHEN r.HORAINI > r.HORAFIN THEN 24 ELSE 0 END

no depende de que el rango termine exactamente a las 00:00 horas.

De todas formas esta soluciónn dá 1 hora en ese rango, pero
(con los datos ejemplo de nuestro amigo) tienen que ser 2 horas.
Quizás tu puedas ver donde está la otra hora. :-)

Saludos,
Carlos
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida