Ver Mensaje Individual
  #23 (permalink)  
Antiguo 17/06/2009, 03:12
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

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.