Selección de actividades entre dos fechas

Uno de los criterios de selección que los usuarios suelen pedir con más frecuencia es poder analizar lo ocurrido entre dos fechas.

En aquellos Hechos que se producen en una fecha concreta, como por ejemplo, las facturas, las visitas a una página web, etc. La fórmula de selección es fácil y únicamente se ha de mirar si la fecha del Hecho está entre las fechas de inicio y de fin del periodo.

En otras palabras, suponiendo que la fechas de inicio y fin del periodo a evaluar se guarden en las variables FIniPeriodo y FFinPeriodo respectivamente, y la fecha del hecho se guarde en el campo FechaHecho, la fórmula de selección quedaría:

FIniPeriodo >= FechaHecho and FechaHecho <= FFinPeriodo

Actividades entre dos fechas
El tema se complica cuando queremos seleccionar las actividades abiertas entre dos fechas. Es decir, lo que queremos analizar son hechos que no se producen en un instante, sino que tienen lugar durante un periodo de tiempo. Por ejemplo, queremos analizar proyectos, expedientes, actividades de servicio, etc.

En este caso, hemos de tener en cuenta que la actividad tendrá dos fechas, la Fecha de Inicio de la Actividad (FIniActiv) y la Fecha de Fin de la Actividad (FFinActiv)

Lo primero que debemos tener claro es las variantes posibles entre fechas de inicio y fin de actividad y fechas de inicio y fin de periodo. La siguiente imagen nos muestra todas las posibilidades.

Esquema de actividades dentro de un periodo de tiempo

En concreto son:
  1. Que la actividad empiece antes de inicio del periodo y acabe dentro del periodo
  2. Que la actividad empiecen entre el periodo y acabe después
  3. Que la actividad empiece y acabe dentro del periodo
  4. Que la actividad empiece antes del periodo y acabe después
  5. Que la actividad empiece y acabe antes del periodo
  6. Que la actividad empiece y acabe después del periodo.
De todas estas, las que nuestro informe debe tratar son las 4 primeras (las que en la imagen están en verde).

El primer impulso para definir la condición que incluya los cinco casos que nos interesan, sería empezar a definir las condiciones que han de cumplir cada una de las posibilidades y unirlas mediante un or.

Sin embargo, existe una forma más fácil y limpia de hacerlo, y es concentrarnos en las que NO están dentro del periodo (las que no queremos analizar).

De esta manera, la fórmula que selecciona todas las actividades que están fuera del periodo es:

FFinActi < FIniPeriodo or FIniAct > FFinPeriodo

Una vez tenemos la condición, para obtener las actividades que SÍ están dentro del periodo, solamente tenemos que negar la condición.

Para ello, echaremos mano del algebra de Boole y en concreto de las leyes de Morgan que nos dicen que "la negación de las conjunción es la disyunción de las negaciones" y "la negación de la disyunción es la conjunción de las negaciones" o lo que se conoce como: No (A y B) es lo mismo que (No A) o (No B) -para la negación de la conjunción- No (A o B) es lo mismo que (No A) y (No B).

De esta manera, negando la condición que selecciona lo que queda fuera del periodo tendremos la condición que selecciona todas las actividades que quedan de alguna manera dentro del periodo. 

Por lo tanto, tendremos que:

Not (FFinActi < FIniPeriodo or FIniAct > FFinPeriodo) 

Aplicando la ley de Morgan


Not (FFinActi < FIniPeriodo) and Not (FIniAct > FFinPeriodo)

Finalmente, resolviendo cada una de las condiciones tendremos que la condición que selecciona las actividades que están dentro del periodo es:

(FFinActi >= FIniPeriodo) and  (FIniAct <= FFinPeriodo)






0 comentarios :

Publicar un comentario

Lo más visto