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. |