Cómo se van a cumplir las tres condiciones para un registro? La fecha de salida lo restringe. Se supone que el case, cuando encuentra la primera coincidencia, la ejecuta y pasa al siguiente registro.
La cuestión es que reescribí la consulta completa. Probé cada suma con su correspondiente where. Por separado todas funcionan bien. Cuando las meto en el case, falla la condición marcada con "**", que es la condición en que la salida es en el siguiente mes. Dejo la consulta y la tabla de donde salen los datos.
Código MySQL:
Ver original+----+-------------+---------------------+---------------------+-----------+-------------+
| id | id_personal | entrada | salida | id_estado | comentarios |
+----+-------------+---------------------+---------------------+-----------+-------------+
| 1 | 2 | 2018-01-01 08:
00:
00 | 2018-01-01 10:
00:
00 | NULL | NULL | | 2 | 2 | 2018-01-02 09:
00:
00 | 2018-01-02 10:
00:
00 | NULL | NULL | | 3 | 5 | 2018-01-02 20:
00:
00 | 2018-01-03 20:
00:
00 | NULL | NULL | | 4 | 5 | 2018-01-04 20:
00:
00 | 2018-01-05 20:
00:
00 | NULL | NULL | | 5 | 5 | 2018-01-31 20:
00:
00 | 2018-02-01 20:
00:
00 | NULL | NULL | | 6 | 2 | 2018-02-02 09:
00:
00 | 2018-02-02 10:
00:
00 | NULL | NULL | | 7 | 2 | 2018-02-03 09:
00:
00 | 2018-02-03 10:
00:
00 | NULL | NULL | | 8 | 5 | 2018-02-04 20:
00:
00 | 0000-00-00 00:
00:
00 | NULL | NULL | | 9 | 3 | 2018-01-31 20:
00:
00 | 0000-00-00 00:
00:
00 | NULL | NULL | +----+-------------+---------------------+---------------------+-----------+-------------+
Código MySQL:
Ver originalset @iniciomes
= '2018-02-01 00:00:00'; set @finmes
= '2018-02-28 23:59:59';
# entrada en el mes en curso
when ((entrada
>= @iniciomes
) and (entrada
<= @finmes
)) # salida en el mes en curso
when ((salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)) # salida en el siguiente mes
** when ((salida
!= 0) and (salida
> @finmes
)) # sin salir
when (salida
= '0000-00-00 00:00:00')
# entrada en el mes anterior
when (entrada
< @iniciomes
) # salida en el mes en curso
when ((salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)) # sin salir
when (salida
= '0000-00-00 00:00:00') # si no se cumple ninguna, suma cero
# else time_format(sec_to_time(sum(timestampdiff(second, @iniciomes, @iniciomes))), '%H:%i')
when ((entrada
>= @iniciomes
) and (entrada
<= @finmes
)) when ((salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)) then (entrada
>= @iniciomes
) and (entrada
<= @finmes
) and (salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)
** when ((salida
!= 0) and (salida
> @finmes
)) then (entrada
>= @iniciomes
) and (entrada
<= @finmes
) and (salida
= (select salida
from personal_asistencia
where entrada
>= @iniciomes
and entrada
<= @finmes
and salida
> @finmes
limit 1))
when (salida
= '0000-00-00 00:00:00') then (entrada
>= @iniciomes
) and (entrada
<= @finmes
) and (salida
= '0000-00-00 00:00:00')
when (entrada
< @iniciomes
) when ((salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)) then (entrada
< @iniciomes
) and (salida
!= '0000-00-00 00:00:00') and (salida
>= @iniciomes
) and (salida
<= @finmes
)
when (salida
= '0000-00-00 00:00:00') then (entrada
< @iniciomes
) and (salida
= '0000-00-00 00:00:00')
Sin embargo, esto funciona bien. Es la misma consulta, sin el resto de condiciones.
Código MySQL:
Ver originalset @iniciomes
= '2018-01-01 00:00:00'; set @finmes
= '2018-01-31 23:59:59'; set @cero
= '0000-00-00 00:00:00';
# entrada en el mes en curso
when ((entrada
>= @iniciomes
) and (entrada
<= @finmes
)) # salida en el siguiente mes
when ((salida
!= @cero
) and (salida
> @finmes
)) when ((entrada
>= @iniciomes
) and (entrada
<= @finmes
)) when ((salida
!= @cero
) and (salida
> @finmes
)) then (entrada
>= @iniciomes
) and (entrada
<= @finmes
) and (salida
= (select salida
from personal_asistencia
where entrada
>= @iniciomes
and entrada
<= @finmes
and salida
> @finmes
limit 1))