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

Finalmente lo resolví usando tablas temporales. Esto es lo que hice.
(lo lógico sería ponerlo en un procedimiento, no?)


Código MySQL:
Ver original
  1. #set @iniciomes = '2018-01-01 00:00:00';
  2. #set @finmes = '2018-02-01 00:00:00';
  3. set @iniciomes = '2018-02-01 00:00:00';
  4. set @finmes = '2018-03-01 00:00:00';
  5. set @cero = '0000-00-00 00:00:00';
  6.  
  7. drop table if exists informe_horas_persona;
  8. create temporary table informe_horas_persona(
  9.   HorasTotales time not null default '00:00:00',
  10.   Pago float(9, 2) not null default 0.00
  11.   ) as
  12.   select personal_asistencia.id_personal, concat(nombre, ' ', apellido) as Nombre, entrada, salida, precio_hora
  13.   from personal_asistencia
  14.   inner join personal on personal.id = personal_asistencia.id_personal
  15.   inner join personal_precio_hora on personal_precio_hora.id_personal = personal_asistencia.id_personal
  16.   where (entrada between @iniciomes and @finmes)
  17. or ((entrada < @iniciomes) and (salida between @iniciomes and @finmes))
  18. or ((entrada < @finmes) and (salida > @finmes))
  19. ;
  20.  
  21. alter table informe_horas_persona modify column precio_hora float(7,2);
  22.  
  23. update informe_horas_persona set HorasTotales = (
  24.  
  25.   case
  26.     when ((entrada between @iniciomes and @finmes) and (salida between @iniciomes and @finmes))
  27.     then time_format(sec_to_time(timestampdiff(second, entrada, salida)), '%H:%i')
  28.    
  29.     when ((entrada between @iniciomes and @finmes) and (salida > @finmes))
  30.     then time_format(sec_to_time(timestampdiff(second, entrada, @finmes)), '%H:%i')
  31.    
  32.     when ((entrada < @iniciomes) and (salida between @iniciomes and @finmes))
  33.     then time_format(sec_to_time(timestampdiff(second, @iniciomes, salida)), '%H:%i')
  34.    
  35.     when ((entrada < @iniciomes) and (salida = @cero))
  36.     then time_format(sec_to_time(timestampdiff(second, @iniciomes, now())), '%H:%i')
  37.    
  38.     when ((entrada between @iniciomes and @finmes) and (salida = @cero))
  39.     then time_format(sec_to_time(timestampdiff(second, entrada, now())), '%H:%i')
  40.   end
  41. )
  42. ;
  43.  
  44. update informe_horas_persona set Pago = (
  45. round(((time_format(HorasTotales, '%H:%i')*60 + minute(HorasTotales))) * (precio_hora/60), 2)
  46. )
  47. ;
  48.  
  49. select * from informe_horas_persona;

Última edición por 7sistemas; 23/02/2018 a las 09:51 Razón: Corregir saltos de línea