Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Ayuda Expertos!

Estas en el tema de Ayuda Expertos! en el foro de Mysql en Foros del Web. Saludos... Ya tenía demasiado tiempo sin pisar éstos territorios de iluminación colectiva... hehehe... Ésta vez será para pedir una manita... Lo que sucede es que ...
  #1 (permalink)  
Antiguo 18/10/2010, 14:03
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 4
Exclamación Ayuda Expertos!

Saludos...

Ya tenía demasiado tiempo sin pisar éstos territorios de iluminación colectiva... hehehe...

Ésta vez será para pedir una manita...


Lo que sucede es que estoy elaborando un simulador de Incapacidades (laborales)...

He tratado de tomar en cuenta todo lo posible... pero al hacer las exaustivas pruebas vienen los errores...

Para éso sólo me interesan 2 tablas...

TABLA1
ID_USR - (ID de usuario/empleado)
DATE_IN - (Fecha de Ingreso)

TABLA2
ID_INC - (ID Incapacidad)
ID_USR - (ID de usuario/empleado)
INC_FROM - (Fecha de inicio de incapacidad)
INC_TO - (Fecha de termino de incapacidad)

Ahora... lo divertido...

Saber cuando cierra la próxima quincena y los cálculos...

La lógica que utilizé fué la siguiente:

Si el empleado pide 7 días de incapacidad en la quincena X...
restamos 15 menos los 7 días que se fué...
... el resultado sería: 8 días trabajados...
Si el empleado se incapacita durante 14 ó más días...
... el resultado sería 0...

Todo iba bien... hasta...

- Las incapacidades "encadenadas" (cuando pide 7 días, después otros 7)...
(Ya que mi consulta sólo jala el último registro en la tabla incapacidades, por lo tanto sólo cuenta los últimos 7 días, ignorando los otros 7.)

- Los días a medias quincenas...
(Ya que si decide irse de incapacidad 14 días, 5 días antes de terminar la quincena... le registra 0 días trabajados... cuando debería registrar 5.)

... ya intenté de muchisimas formas, pero no salen los resultados deseados...


Al parecer lo que necesito es crear una consulta que en base a la diferencia_de_fechas_(INC_FROM,INC_TO)...
... sólo sume los días correspondientes al "rango_de_fechas_de_la_quincena_correspondiente".. .
Pero no encuentro la forma...

¿Ó la solución es que al momento de insertar el rango de fechas se agrege a la tabla 1 registro por día, para así sumar los que no salgan de los días_de_la_quincena_actual? (NO CREEEEO)

Gracias por su respuesta...
  #2 (permalink)  
Antiguo 19/10/2010, 02:00
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Ayuda Expertos!

El tema es largo de solucionar, excepto que alguien lo tenga hecho...

Pero yo exploraria la idea de comparar la fecha inicial de la incapacidad con la fecha final de la quincena con lo que obtendrias los dias de incapacidad dentro de la quincena, el resto serian de la quincena siguiente y si son mas de 14 habrá dias para la posterior a esa...

Primero identificar que incapacidades debes tener en cuenta, aquellas que una de sus fechas este entre las fechas de la quincena y aquellas que las fechas de la quincena entera esten entre las fechas de la incapacidad.

Luego se trataria de obtener dias asociados a quincenas y al final sumar por quincenas, con lo que de paso solucionas el primer caso que mencionas de las incapacidades consecutivas...


Si fechainicial y fechafinal estan dentro de la quinzena todos los dias a la quinzena

Si fechafinal incap.>fechafinal quinzena -> fechafinalquin - fechainicial inc = dias para la quincena

...

Necsitas una serie de condicionales que cierre todos los casos... no se si será mas comodo/eficiente trabajarlo con programació externa o en el propio sql.

Quim
  #3 (permalink)  
Antiguo 19/10/2010, 18:17
 
Fecha de Ingreso: agosto-2008
Mensajes: 82
Antigüedad: 15 años, 8 meses
Puntos: 4
Respuesta: Ayuda Expertos!

Saludos...

Antes que nada, muchas gracias por contestar Quim...

En base a condicionar las posibilidades he conseguido lo siguiente...

Lógica:
(El resultado de la query serán los días a descontar de la quincena a pagar...)

INC_DIA = DIAS DE INCAPACIDAD...
INC_INI = FECHA DE COMIENZO DE INCAPACIDAD
INC_TER = FECHA DE TÉRMINO DE INCAPACIDAD
QUI_INI = FECHA DE INICIO DE QUINCENA
QUI_TER = FECHA DE TÉRMINO DE QUINCENA

Si INC_DIA >= 14 :
15
Si (INC_INI entre QUI_INI y QUI_TER) y INC_TER >= QUI_TER:
QUI_TER - INC_INI
Si INC_INI <= QUI_INI y (INC_TER entre QUI_INI y QUI_TER):
(INC_TER - INC_INI) + (QUI_INI - INC_INI)...

Ahora la Query:

QUI_INI = Inicio de quincena.
QUI_END = Cierre de quincena.

Código MySQL:
Ver original
  1.   CASE WHEN DATEDIFF(DIS_TO, DIS_FROM) >= 14 THEN
  2.     15
  3.   ELSE
  4.     CASE WHEN ((DIS_FROM BETWEEN QUI_INI AND QUI_END) AND DIS_TO >= QUI_END ) THEN
  5.       DATEDIFF(QUI_END, DIS_FROM)
  6.     WHEN (DIS_FROM <= QUI_INI AND (DIS_TO BETWEEN QUI_INI AND QUI_END)) THEN
  7.       DATEDIFF(DIS_TO, DIS_FROM) + DATEDIFF(QUI_INI,DIS_FROM)
  8.     END
  9.   END
  10. )RESTAR_DIAS
  11. FROM EMPLOYEE_DISABILITIES
  12. WHERE ID_EMPLOYEE = 666;


Ya lo he probado con un par de ejemplos y me funcionó... pero siempre nos sorprenden las posibilidades que pueden volver obsoleto nuestro cálculo...

Cualquier sugerencia para implementar/corregir será bien recibida...

Muchas gracias y Nos seguimos leyendo...

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:43.