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

Calcular horas trabajadas nocturnas MySQL

Estas en el tema de Calcular horas trabajadas nocturnas MySQL en el foro de Mysql en Foros del Web. hola soy nuevo en el foro tengo un problema con una cosulta tengo una tabla con los siguientes datos +-----+-----+------+------+-----+ | IdHora | HorIni | ...
  #1 (permalink)  
Antiguo 13/06/2009, 17:07
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Calcular horas trabajadas nocturnas MySQL

hola soy nuevo en el foro
tengo un problema con una cosulta

tengo una tabla con los siguientes datos
+-----+-----+------+------+-----+
| IdHora | HorIni | HorFin | Hortra | DiaTra |
+-----+-----+------+------+-----+
| 1 | 11:00 | 10:00 | 23:00 | 2001-02-04 |
| 2 | 02:00 | 14:00 | 12:00 | 2005-06-14 |
| 3 | 14:30 | 16:30 | 02:00 | 2007-04-09 |
| 4 | 05:00 | 11:00 | 06:00 | 2004-08-05 |
| 5 | 12:00 | 10:00 | 22:00 | 2006-10-20 |
+-----+-----+------+------+-----+
Donde

IdHora =ID
HorIni = hora que inicio
HorFin = Hora que finalizo
Hortra =Horas trabajadas
DiaTra = día trabajado

De la cual necesito saber las horas trabajadas nocturnas
Teniendo en cuenta que las horas nocturnas son de las 18:00 a las 06:00
Mas o menos así

+-----+-----+
| IdHora | HorNoc |
+-----+-----+
| 1 | 12:00 |
| 2 | 04:00 |
| 3 | 00:00 |
| 4 | 01:00 |
| 5 | 10:00 |
+-----+-----+
Les agradezco mucho si me pueden colaborar, muchas gracias de antemano
  #2 (permalink)  
Antiguo 14/06/2009, 01:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Debes aclararnos algunas cosas. ¿Los campos donde incluyes horas son de tipo TIME?, ¿Y el DiaTra es el día de comienzo o de fin? Piensa si pasa de las 12 de la noche ya son dos días.
Una pregunta más: ¿quieres resolverlo con la base o no es estrictamente necesario y podrías usar pogramación, es decir, una función con el programa que emplees?
  #3 (permalink)  
Antiguo 14/06/2009, 09:57
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
Iniciado por jurena Ver Mensaje
Debes aclararnos algunas cosas. ¿Los campos donde incluyes horas son de tipo TIME?, ¿Y el DiaTra es el día de comienzo o de fin? Piensa si pasa de las 12 de la noche ya son dos días.
Una pregunta más: ¿quieres resolverlo con la base o no es estrictamente necesario y podrías usar pogramación, es decir, una función con el programa que emplees?
Gracias por contestar y por tu interés

Respecto a tus preguntas
¿Los campos donde incluyes horas son de tipo TIME?,
R=Si los campos de horas son tipo TIME
¿Y el DiaTra es el día de comienzo o de fin?
R=Es el día que comenzó
¿quieres resolverlo con la base o no es estrictamente necesario y podrías usar programación, es decir, una función con el programa que emplees?
R=Me gustaría que fuera en la base de datos, pero sí se podría utilizar.programación, yo utilizo PHP.

Muchas gracias y espero q me puedas colaborar
  #4 (permalink)  
Antiguo 14/06/2009, 12:06
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Una pregunta más: ¿que versión de MySQL utilizas?
Lo pregunto para recurrir a unas u otras funciones de fecha tiempo.
  #5 (permalink)  
Antiguo 14/06/2009, 13:34
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
Iniciado por jurena Ver Mensaje
Una pregunta más: ¿que versión de MySQL utilizas?
Lo pregunto para recurrir a unas u otras funciones de fecha tiempo.
MySQL Database Version 5.0.51b

y muchas gracias por tu interes
  #6 (permalink)  
Antiguo 14/06/2009, 15:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Aunque estoy haciendo pruebas con tus datos, y es posible que encontremos alguna solución, yo te aconsejaría que pidieses ayuda en el foro PHP, pues seguro que allí encontrarás una solución mejor. Explica bien los datos que tienes. Ellos te ayudarán a preparar una función.
  #7 (permalink)  
Antiguo 14/06/2009, 15:13
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Calcular horas trabajadas nocturnas MySQL

A nivel de consulta, creo que sería un poco complejo.

Pero te recomendaría realizar una función en mysql que valide y retorne los datos esperados.
De esta forma, lo estarias haciendo desde la base de datos.

Un saludo,
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #8 (permalink)  
Antiguo 14/06/2009, 15:31
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Gracias por tu esfuerzo
seguire tu consejo y lo escribire en el foro de PHP
sin embargo espero que me puestas ayudar.
gracias
  #9 (permalink)  
Antiguo 14/06/2009, 17:59
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Calcular horas trabajadas nocturnas MySQL

Bueno, veamos el caso: No hay una consulta que te devuelva exactamente un horario "nocturno", pero se puede considerar que si tenemos las horas límite, podemos calcular el espacio de tiempo que queda entre el punto de entrada y las cotas usadas.
Para esto hay que calcular los dos segmentos (inferior y superior) por separado.
Caso:
Cita:
+-----+-----+------+------+-----+
| IdHora | HorIni | HorFin | Hortra | DiaTra |
+-----+-----+------+------+-----+
| 1 | 11:00 | 10:00 | 23:00 | 2001-02-04 |
| 2 | 02:00 | 14:00 | 12:00 | 2005-06-14 |
| 3 | 14:30 | 16:30 | 02:00 | 2007-04-09 |
| 4 | 05:00 | 11:00 | 06:00 | 2004-08-05 |
| 5 | 12:00 | 10:00 | 22:00 | 2006-10-20 |
+-----+-----+------+------+-----+
Yo lo pondría así:
Código sql:
Ver original
  1. SELECT IdHora, SEC_TO_TIME(SUM(HT)) HorasTrabajadas
  2. FROM
  3.    (SELECT IdHora, TIME_TO_SEC(SUBTIME('06:00',HorIni)) HT
  4.    FROM HorasTrab
  5.    WHERE (HoraIni <'06:00' AND HorFin > '06:00')
  6.    UNION
  7.    SELECT IdHora, TIME_TO_SEC(SUBTIME(HorFin, '18:00'))  HT
  8.    FROM HorasTrab
  9.    WHERE (HoraIni <'18:00' AND Horafin > '18:00')) T1
  10. GROUP BY IdHora;
Prueba y veremos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #10 (permalink)  
Antiguo 14/06/2009, 19:46
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Código sql:
Ver original
  1. SELECT IdHora, SEC_TO_TIME(SUM(HT)) HorasTrabajadas
  2. FROM
  3. (SELECT IdHora, TIME_TO_SEC(SUBTIME('06:00',HorIni)) HT
  4. FROM HorasTrab
  5. WHERE (HoraIni <'06:00' AND HorFin > '06:00')
  6. UNION
  7. SELECT IdHora, TIME_TO_SEC(SUBTIME(HorFin, '18:00')) HT
  8. FROM HorasTrab
  9. WHERE (HoraIni <'18:00' AND Horafin > '18:00')) T1
  10. GROUP BY IdHora;
Muchas gracias por tu colaboración
Lo estoy probando y hice algunas modificaciones

Código SQL:
Ver original
  1. SELECT IdHora, SEC_TO_TIME(SUM(HT)) HorasTrabajadas
  2. FROM
  3. (SELECT IdHora, TIME_TO_SEC(SUBTIME('06:00',HorIni)) HT
  4. FROM HorasTrab
  5. WHERE (HoraIni <'06:00' AND HorFin > '06:00')
  6. UNION
  7. SELECT IdHora, TIME_TO_SEC(SUBTIME(HorFin, '18:00')) HT
  8. FROM HorasTrab
  9. WHERE (HoraIni <'18:00' AND Horafin > '18:00')
  10. UNION
  11. SELECT IdHora, TIME_TO_SEC(SUBTIME(HorFin, '18:00')) HT
  12. FROM HorasTrab
  13. WHERE (HoraIni <'18:00' AND Horafin < '06:00' AND Horafin<>HoraIni)) T1
  14. GROUP BY IdHora;
Pero todavía falta validar horas como los del IdHora 1 y 5 ya que no cumplen las condiciones.

+-----+-----+------+------+-----+
| IdHora | HorIni | HorFin | Hortra | DiaTra |
+-----+-----+------+------+-----+
| 1 | 11:00 | 10:00 | 23:00 | 2001-02-04 |
| 2 | 02:00 | 14:00 | 12:00 | 2005-06-14 |
| 3 | 14:30 | 16:30 | 02:00 | 2007-04-09 |
| 4 | 05:00 | 11:00 | 06:00 | 2004-08-05 |
| 5 | 12:00 | 10:00 | 22:00 | 2006-10-20 |
+-----+-----+------+------+-----+

De todas formas estoy eternamente agradecido con tu ayuda.
Seguiré probando y les cuento.

Muchas gracias
  #11 (permalink)  
Antiguo 14/06/2009, 20:02
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Calcular horas trabajadas nocturnas MySQL

Me alegro que la idea te sirva de guía.
Yo uso un esquema semejante para obtener los períodos fragmentados de ciertos eventos que se producen por periodos de tiempo variables dentro de ciertos horarios.
En cuanto a los caso que muestras en el final, deberías verificar por qué no quedan contenidos en la segunda subconsulta.
En cualquier caso no me queda claro cuál es la diferencia entre el campo HorFin y HorTrab. Yo asumía que la primera era la hora de salida, pero en ese caso ¿qué representa la segunda?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 14/06/2009, 20:10
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
Iniciado por gnzsoloyo Ver Mensaje
En cualquier caso no me queda claro cuál es la diferencia entre el campo HorFin y HorTrab. Yo asumía que la primera era la hora de salida, pero en ese caso ¿qué representa la segunda?
Hortra, es la suma de la hora inicial y la hora de salida.

Muchas gracias por tu interés
y espero que me sigas colaborando
  #13 (permalink)  
Antiguo 15/06/2009, 13:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Zerts,
esta consulta hace, creo, lo que quieres, y te devuelve el resultado en horas. La he hecho con varios If, aunque seguro que con case when quedaría más elegante. No osbtante, creo que funciona, aunque te diré que pongo la confianza en los datos que tú das, que por cierto no sé cómo generas. Yo hubiera hecho las cosas de otro modo y hubiera evitado muchas de estas operaciones. He puesto como nombre de tabla tabla. Ahí va:

SELECT cast(concat(DiaTRa,' ',HorIni) as datetime) inicio, DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) fin, addtime(addtime(addtime(addtime(addtime(If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) < DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY) AND HorFin < '18:00:00','00:00:00','00:00:00'), If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) < DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY) AND HorIni < '18:00:00' AND Horfin > '18:00:00',TIMEDIFF(HorFin,'18:00:00'),'00:00:00') ), If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) < DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY) AND HorIni > '18:00:00' AND Horfin > '18:00:00',TIMEDIFF(HorFin,HorIni),'00:00:00')), If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) > DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY) AND HorIni < '18:00:00',TIMEDIFF('24:00:00', '18:00:00'),'00:00:00')), If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) > DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY) AND HorIni > '18:00:00',TIMEDIFF('24:00:00', HorIni),'00:00:00')), If (DATE_ADD(cast(concat(DiaTRa,' ',HorIni) as datetime), INTERVAL HOUR(HorTra) hour ) > DATE_ADD(CAST(CONCAT(DiaTra,' 00:00:00')as datetime), INTERVAL 1 DAY),IF (HorFin >'06:00:00', '06:00:00',HorFin), '00:00:00'))noc FROM `tabla`
  #14 (permalink)  
Antiguo 15/06/2009, 14:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Calcular horas trabajadas nocturnas MySQL

El problema básico de esta consulta es que tiene que considerar estas situaciones:
1. El horario queda contenido entre 00:00 y 06:00 y la hora de inicio es anterior a la de final.
2. El horario queda contenido entre 00:00 y 06:00 y la hora de inicio es posterior a la de final.
3. El horario queda contenido entre 06:00 y 18:00 y la hora de inicio es anterior a la de final.
4. El horario queda contenido entre 06:00 y 18:00 y la hora de inicio es posterior a la de final.
5. El horario queda contenido entre 18:00 y 24:00 y la hora de inicio es anterior a la de final.
6. El horario queda contenido entre 18:00 y 24:00 y la hora de inicio es posterior a la de final.
7. El horario cruza el límite de 06:00 hs.
8. El horario cruza el límite de 18:00 hs.

La consulta debe calcula el segmento de tiempo correspondiente entre las 00:00 y las 06:00 hs y entre las 18:00 y las 24:00 (23:59:59) en cada uno de los casos, lo que puede implicar que se deban realizar 15 UNION para 16 consultas, antes de sumar los segmentos de tiempo obtenidos.

Creo que habría que buscar o un modelo más eficiente, o validar estos problemas antes de ingresar los registros.
Es posible, incluso, que si en lugar de establecer las horas nocturnas, calculamos sólo las diurnas y las restamos del total trabajado, la consulta se vuelva mucho más sencilla.

¿Qué opinas? Piensalo...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #15 (permalink)  
Antiguo 15/06/2009, 14:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

amigo gnzsoloyo,
estoy de acuerdo contigo: esto no es muy eficiente, y repensaré las opciones que propones; y te digo que también pensé en la opción que proponías, la de sumar las horas diurnas y restarlas al total. Yo creo que otro de los problemas es el modo en que se introducen los datos, yo hubiera incluido sólo dos datetime con fechahora inicio y fechahora fin. La resta de horas sería más fácil y evitaríamos todos esos concat y castings, y posiblemente ganaríamos algo en eficiencia, pero si digo la verdad, yo lo haría todo con PHP. Crearía una función y la aplicaría a esos dos campos de fechahorainicio y fechahorafin. Seguiremos dándole vueltas.
Saludos.
  #16 (permalink)  
Antiguo 15/06/2009, 14:58
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
yo hubiera incluido sólo dos datetime con fechahora inicio y fechahora fin
Totalmente de acuerdo. Eso haría que el tercer campo (horas trabajadas) fuese simplemente calculable.
Pos otro lado, es cierto que sea posible que termine siendo más eficiente resolverlo por porgramación. Menos dolores de cabeza.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #17 (permalink)  
Antiguo 15/06/2009, 21:24
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Muchas gracias a todos
probare lo que me dice lo de calcular las horas diurnas
  #18 (permalink)  
Antiguo 16/06/2009, 00:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Zerts,
en realidad, es casi el mismo problema. Aunque no es muy eficiente, la consulta que te puse creo que funciona, y lo hace con lo que tienes (pruébala), pero si quieres un consejo yo, como ya te he dicho, cambiaría el modo de insertar los datos tratando de insertar dos datetime uno fechahorainicio y otro llamado fechahorafin. Y luego pediría ayuda en el foro PHP para construir una función, función que no haría otra cosa que recoger esos dos datos y llevar a cabo las comparaciones que tiene la consulta (alguna podría eliminarse) y que bien describe gnzsoloyo en las 8 consideraciones de la consulta que te propuse. No descartes tampoco la posibilidad recomendada por huesos52 y de hacerlo con una función que al insertar te proporcione las horas nocturnas y valide los datos introducidos, aunque eso te obligaría a almacenar en un campo el dato y luego hacer sumas.

Última edición por jurena; 16/06/2009 a las 01:41
  #19 (permalink)  
Antiguo 16/06/2009, 12:29
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Muchas gracias a todos por sus opiniones y a la ayuda proporcionada, creo que ya termine la consulta, me quedo así

Código SQL:
Ver original
  1. SELECT IdHora,  SEC_TO_TIME( SUM( HT ) ) HorasTrabajadas
  2. FROM (
  3. SELECT IdHora, TIME_TO_SEC( SUBTIME( '06:00', HorIni  ) ) HT
  4. FROM HorasTrab
  5. WHERE (
  6. HorIni  < '06:00'
  7. AND HorFin > '06:00'
  8. AND HorIni  < HorFin
  9. )
  10. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME( HorFin, '18:00' ) ) HT
  11. FROM HorasTrab
  12. WHERE (
  13. HorIni  < '18:00'
  14. AND HorFin > '18:00'
  15. AND HorIni  < HorFin
  16. )
  17. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME( '06:00', HorFin ) ) HT
  18. FROM HorasTrab
  19. WHERE (
  20. HorIni  >'06:00'
  21. AND HorFin < '06:00'
  22. AND HorIni  < HorFin
  23. )
  24. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME( ADDTIME( SUBTIME( '24:00', HorIni  ) , '06:00' ) , SUBTIME( HorFin, '18:00' ) ) ) HT
  25. FROM HorasTrab
  26. WHERE (
  27. HorIni  > '18:00'
  28. AND HorFin > '18:00'
  29. AND HorIni  > HorFin
  30. )
  31. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME( SUBTIME( '06:00', HorIni  ) , ADDTIME( HorFin, '06:00' ) ) ) HT
  32. FROM HorasTrab
  33. WHERE (
  34. HorIni  < '06:00'
  35. AND HorFin < '06:00'
  36. AND HorIni  > HorFin
  37. )UNION SELECT IdHora, TIME_TO_SEC( ADDTIME('06:00',HorFin  ) ) HT
  38. FROM HorasTrab
  39. WHERE (
  40. HorIni  > '06:00'
  41. AND HorIni  < '18:00'
  42. AND HorFin <'06:00'
  43. AND HorIni  > HorFin
  44. )
  45. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME('06:00',SUBTIME( '24:00', HorIni  )  ) ) HT
  46. FROM HorasTrab
  47. WHERE (
  48. HorIni  > '18:00'
  49. AND HorFin >'06:00'
  50. AND HorFin < '18:00'
  51. AND HorIni  > HorFin
  52. )
  53. UNION SELECT IdHora, TIME_TO_SEC('12:00') HT
  54. FROM HorasTrab
  55. WHERE (
  56. HorIni  < '18:00'
  57. AND HorIni  > '06:00'
  58. AND HorFin < '18:00'
  59. AND HorFin >'06:00'
  60. AND HorIni  > HorFin
  61. )
  62. UNION SELECT IdHora, TIME_TO_SEC('00:00') HT
  63. FROM HorasTrab
  64. WHERE (
  65. HorIni  >= '06:00'
  66. AND HorFin <= '18:00'
  67. OR HorIni =HorFin
  68. )
  69. )T1
  70. GROUP BY IdHora
Cualquier sugerencia es bienvenida
  #20 (permalink)  
Antiguo 16/06/2009, 13:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Zerts, a mí no me ofrece los resultados esperados:
23:00:00 04:00:00 05:00:00 2009-06-23 debería dar 05:00:00
23:00:00 02:00:00 03:00:00 2009-06-16 debería dar 03:00:00
19:00:00 22:00:00 03:00:00 2009-06-17 debería dar 03:00:00
Haz una prueba y verás que da 00:00:00 en las dos primeras y la última ni la tiene en cuenta.
Comprueba los resultados con la consulta que te propuse. Sólo tienes que cambiarle el nombre de la tabla al de HorasTrab
  #21 (permalink)  
Antiguo 16/06/2009, 15:19
 
Fecha de Ingreso: junio-2009
Ubicación: Bogota
Mensajes: 16
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Calcular horas trabajadas nocturnas MySQL

Cita:
Iniciado por jurena Ver Mensaje
Zerts, a mí no me ofrece los resultados esperados:
23:00:00 04:00:00 05:00:00 2009-06-23 debería dar 05:00:00
23:00:00 02:00:00 03:00:00 2009-06-16 debería dar 03:00:00
19:00:00 22:00:00 03:00:00 2009-06-17 debería dar 03:00:00
Haz una prueba y verás que da 00:00:00 en las dos primeras y la última ni la tiene en cuenta.
Comprueba los resultados con la consulta que te propuse. Sólo tienes que cambiarle el nombre de la tabla al de HorasTrab
Muchas gracias por revisar la consulta y si tienes razón, creo que ahora si
Código sql:
Ver original
  1. SELECT IdHora, SEC_TO_TIME( SUM( HT ) ) HorasTrabajadas
  2. FROM (
  3. SELECT IdHora, TIME_TO_SEC( SUBTIME( '06:00', HorIni ) ) HT
  4. FROM HorasTrab
  5. WHERE (
  6. HorIni < '06:00'
  7. AND HorFin >= '06:00'
  8. AND HorIni < HorFin
  9. )
  10. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME( HorFin, '18:00' ) ) HT
  11. FROM HorasTrab
  12. WHERE (
  13. HorIni < '18:00'
  14. AND HorFin > '18:00'
  15. AND HorIni < HorFin
  16. )
  17. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME( '06:00', HorFin ) ) HT
  18. FROM HorasTrab
  19. WHERE (
  20. HorIni >'06:00'
  21. AND HorFin <= '06:00'
  22. AND HorIni < HorFin
  23. )
  24. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME( ADDTIME( SUBTIME( '24:00', HorIni ) , '06:00' ) , SUBTIME( HorFin, '18:00' ) ) ) HT
  25. FROM HorasTrab
  26. WHERE (
  27. HorIni > '18:00'
  28. AND HorFin >= '18:00'
  29. AND HorIni > HorFin
  30. )
  31. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME( SUBTIME( '06:00', HorIni ) , ADDTIME( HorFin, '06:00' ) ) ) HT
  32. FROM HorasTrab
  33. WHERE (
  34. HorIni < '06:00'
  35. AND HorFin <= '06:00'
  36. AND HorIni > HorFin
  37. )
  38. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME('06:00',HorFin  ) ) HT
  39. FROM HorasTrab
  40. WHERE (
  41. HorIni > '06:00'
  42. AND HorFin <='06:00'
  43. AND HorIni < '18:00'
  44. AND HorIni > HorFin
  45. )
  46. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME('06:00',SUBTIME( '24:00', HorIni )  ) ) HT
  47. FROM HorasTrab
  48. WHERE (
  49.  HorFin >='06:00'
  50. AND HorIni > '18:00'
  51. AND HorIni > HorFin
  52. )
  53. UNION SELECT IdHora, TIME_TO_SEC( ADDTIME('06:00',SUBTIME( '24:00', HorIni )  ) ) HT
  54. FROM HorasTrab
  55. WHERE (
  56.  HorFin >='06:00'
  57. AND HorIni > '18:00'
  58. AND HorIni > HorFin
  59. )
  60. UNION SELECT IdHora, TIME_TO_SEC(  ADDTIME( SUBTIME( '24:00', HorIni ) , HorFin ) ) HT
  61. FROM HorasTrab
  62. WHERE (
  63. HorIni >= '18:00'
  64. AND HorFin <= '06:00'
  65. AND HorIni > HorFin
  66. )
  67. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME(HorFin ,HorIni ) ) HT
  68. FROM HorasTrab
  69. WHERE (
  70. HorIni >= '18:00'
  71. AND HorFin <='24:00'
  72. AND HorIni < HorFin
  73. )
  74. UNION SELECT IdHora, TIME_TO_SEC( SUBTIME(HorFin ,HorIni ) ) HT
  75. FROM HorasTrab
  76. WHERE (
  77. HorIni >= '00:00'
  78. AND HorFin <='06:00'
  79. AND HorIni < HorFin
  80. )
  81. UNION SELECT IdHora, TIME_TO_SEC('12:00') HT
  82. FROM HorasTrab
  83. WHERE (
  84. HorIni < '18:00' AND HorIni > '06:00'
  85. AND HorFin <= '18:00' AND HorFin >'06:00'
  86. AND HorIni > HorFin
  87. )
  88. UNION SELECT IdHora, TIME_TO_SEC('00:00') HT
  89. FROM HorasTrab
  90. WHERE (
  91. HorIni >= '06:00'
  92. AND HorFin <= '18:00'
  93. OR HorIni=HorFin
  94. )
  95. )T1
  96. GROUP BY IdHora
  #22 (permalink)  
Antiguo 17/06/2009, 00:40
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

Ya te falta poco.
Prueba con este dato
05:00:00 11:00:00 06:00:00 2004-08-05
a mí me da 01:00:00 con tu consulta y debería ser 00:00:00
Pon en la base de pruebas todos las posibles situaciones y comprueba una a una.
  #23 (permalink)  
Antiguo 17/06/2009, 03:12
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Calcular horas trabajadas nocturnas MySQL

No edito, porque esta propuesta es distinta a las anteriores mías. Tiene en cuenta todo el rango de noche. Devuelve segundos que luego son convertidos en horas. No sé si será más eficiente, pero espero que sí. Nos lo dirán nuestros técnicos. He usado case when... then...
Puede que falte algún detalle, pero puede corregirse pienso.
SELECT (CASE WHEN CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME) < CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME) AND DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR) > CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME) AND DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR) <= DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY) THEN SEC_TO_TIME(TIMESTAMPDIFF(SECOND, CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME)
, DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR))) WHEN CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME) > CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME) AND DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR) < DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY) THEN SEC_TO_TIME(TIMESTAMPDIFF(SECOND, CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME), DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR))) WHEN CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME) < CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME) AND DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR) > DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY) THEN SEC_TO_TIME(TIMESTAMPDIFF(SECOND, CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME)
, DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY))) WHEN CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME) > CAST(CONCAT(DiaTRa,' 18:00:00')AS DATETIME) AND DATE_ADD(CAST(CONCAT(DiaTRa,' ',HorIni) as DATETIME), INTERVAL HOUR(HorTra) HOUR) > DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY) THEN SEC_TO_TIME(TIMESTAMPDIFF(SECOND, CAST(CONCAT(DiaTRa,' ',HorIni) AS DATETIME)
, DATE_ADD(CAST(CONCAT(DiaTRa,' 06:00:00')AS DATETIME), INTERVAL 1 DAY))) else '00:00:00' END)Horasnoche FROM horastrab

Y de introducir la fechahora inicio y fecha hora fin como dije sería mucho mejor.
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




La zona horaria es GMT -6. Ahora son las 09:33.