Ver Mensaje Individual
  #5 (permalink)  
Antiguo 19/02/2018, 04:10
7sistemas
 
Fecha de Ingreso: marzo-2010
Ubicación: Buenos Aires
Mensajes: 59
Antigüedad: 14 años, 1 mes
Puntos: 2
Respuesta: select case suma incorrecta

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
  1. +----+-------------+---------------------+---------------------+-----------+-------------+
  2. | id | id_personal | entrada             | salida              | id_estado | comentarios |
  3. +----+-------------+---------------------+---------------------+-----------+-------------+
  4. |  1 |           2 | 2018-01-01 08:00:00 | 2018-01-01 10:00:00 |      NULL | NULL        |
  5. |  2 |           2 | 2018-01-02 09:00:00 | 2018-01-02 10:00:00 |      NULL | NULL        |
  6. |  3 |           5 | 2018-01-02 20:00:00 | 2018-01-03 20:00:00 |      NULL | NULL        |
  7. |  4 |           5 | 2018-01-04 20:00:00 | 2018-01-05 20:00:00 |      NULL | NULL        |
  8. |  5 |           5 | 2018-01-31 20:00:00 | 2018-02-01 20:00:00 |      NULL | NULL        |
  9. |  6 |           2 | 2018-02-02 09:00:00 | 2018-02-02 10:00:00 |      NULL | NULL        |
  10. |  7 |           2 | 2018-02-03 09:00:00 | 2018-02-03 10:00:00 |      NULL | NULL        |
  11. |  8 |           5 | 2018-02-04 20:00:00 | 0000-00-00 00:00:00 |      NULL | NULL        |
  12. |  9 |           3 | 2018-01-31 20:00:00 | 0000-00-00 00:00:00 |      NULL | NULL        |
  13. +----+-------------+---------------------+---------------------+-----------+-------------+


Código MySQL:
Ver original
  1. set @iniciomes = '2018-02-01 00:00:00';
  2. set @finmes = '2018-02-28 23:59:59';
  3.  
  4. select personal_asistencia.id_personal, monthname(@iniciomes) as Mes,
  5.   # entrada en el mes en curso  
  6.   when ((entrada >= @iniciomes) and (entrada <= @finmes))
  7.     then
  8.       case
  9.     # salida en el mes en curso
  10.     when ((salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes))
  11.     then time_format(sec_to_time(sum(timestampdiff(second, entrada, salida))), '%H:%i')
  12.     # salida en el siguiente mes
  13. **  when ((salida != 0) and (salida > @finmes))
  14.     then time_format(sec_to_time(sum(timestampdiff(second, entrada, @finmes))), '%H:%i')
  15.     # sin salir
  16.     when (salida = '0000-00-00 00:00:00')
  17.     then time_format(sec_to_time(sum(timestampdiff(second, entrada, now()))), '%H:%i')
  18.       end
  19.  
  20.   # entrada en el mes anterior
  21.   when (entrada < @iniciomes)
  22.   then
  23.     case
  24.       # salida en el mes en curso
  25.       when ((salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes))
  26.       then time_format(sec_to_time(sum(timestampdiff(second, @iniciomes, salida))), '%H:%i')
  27.       # sin salir
  28.       when (salida = '0000-00-00 00:00:00')
  29.       then time_format(sec_to_time(sum(timestampdiff(second, @iniciomes, now()))), '%H:%i')
  30.     end
  31.   # si no se cumple ninguna, suma cero
  32. #  else time_format(sec_to_time(sum(timestampdiff(second, @iniciomes, @iniciomes))), '%H:%i')
  33.  
  34. end as Horas
  35. from personal_asistencia
  36.   when ((entrada >= @iniciomes) and (entrada <= @finmes))
  37.   then
  38.     case
  39.       when ((salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes))
  40.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes)
  41.      
  42. **      when ((salida != 0) and (salida > @finmes))
  43.       then (entrada >= @iniciomes) and (entrada <= @finmes) and
  44. (salida = (select salida from personal_asistencia where entrada >= @iniciomes and entrada <= @finmes and salida > @finmes limit 1))
  45.      
  46.       when (salida = '0000-00-00 00:00:00')
  47.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida = '0000-00-00 00:00:00')
  48.     end
  49.  
  50.     when (entrada < @iniciomes)
  51.     then
  52.       case
  53.     when ((salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes))
  54.     then (entrada < @iniciomes) and (salida != '0000-00-00 00:00:00') and (salida >= @iniciomes) and (salida <= @finmes)
  55.  
  56.     when (salida = '0000-00-00 00:00:00')
  57.     then (entrada < @iniciomes) and (salida = '0000-00-00 00:00:00')
  58.       end
  59. group by id_personal


Sin embargo, esto funciona bien. Es la misma consulta, sin el resto de condiciones.


Código MySQL:
Ver original
  1. set @iniciomes = '2018-01-01 00:00:00';
  2. set @finmes = '2018-01-31 23:59:59';
  3. set @cero = '0000-00-00 00:00:00';
  4.  
  5. select personal_asistencia.id_personal, monthname(@iniciomes) as Mes,
  6.   # entrada en el mes en curso  
  7.   when ((entrada >= @iniciomes) and (entrada <= @finmes))
  8.     then
  9.       case
  10.     # salida en el siguiente mes
  11.     when ((salida != @cero) and (salida > @finmes))
  12.     then time_format(sec_to_time(sum(timestampdiff(second, entrada, @finmes))), '%H:%i')
  13.       end
  14. end as Horas
  15. from personal_asistencia
  16.   when ((entrada >= @iniciomes) and (entrada <= @finmes))
  17.   then
  18.     case
  19.       when ((salida != @cero) and (salida > @finmes))
  20.       then (entrada >= @iniciomes) and (entrada <= @finmes) and (salida = (select salida from personal_asistencia where entrada >= @iniciomes and entrada <= @finmes and salida > @finmes limit 1))
  21.     end
  22. group by id_personal

Última edición por 7sistemas; 19/02/2018 a las 07:09 Razón: Añadí nueva consulta.