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 originalSELECT IdHora, SEC_TO_TIME(SUM(HT)) HorasTrabajadas
FROM
(SELECT IdHora, TIME_TO_SEC(SUBTIME('06:00',HorIni)) HT
FROM HorasTrab
WHERE (HoraIni <'06:00' AND HorFin > '06:00')
UNION
SELECT IdHora, TIME_TO_SEC(SUBTIME(HorFin, '18:00')) HT
FROM HorasTrab
WHERE (HoraIni <'18:00' AND Horafin > '18:00')) T1
GROUP BY IdHora;
Prueba y veremos.