Ver Mensaje Individual
  #13 (permalink)  
Antiguo 15/06/2009, 13:15
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
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`