21 de marzo de 2008

Conflicto en rango de fechas

Artículo original: Date range conflicts
http://www.foxpert.com/knowlbits_200711_1.htm
Autor: Christof Wollenhaupt
Traducido por: Ana María Bisbé York

Un problema común en las aplicaciones de bases de datos es comprobar los conflictos en rangos de fecha o fecha-hora. Por ejemplo, su aplicación puede manejar citas que tienen fecha de inicio y duración. Aquí podríamos hablar de minutos o días, el problema fundamental sigue siendo el mismo. Cuando actualice una cita nueva tiene que asegurarse de que no entra en conflicto con una existente.

El problema con los rangos de fecha está en que hay cuatro variaciones que tiene que cubrir. (a) Un rango puede no tener conflicto con otro rango, (b) podría fallar completamente dentro de otro rango, (c) empieza antes; pero termina dentro de otro rango, (d) empieza dentro; pero termina después que otro rango. No puedo nunca recordar la consulta para comprobar cualquier elemento conflictivo. Entonces, (basado en http://ryanfarley.com/blog/archive/2004/08/19/966.aspx):

Si alguna de las fechas puede estar vacía:

(NOT((table.date_end < m.date_start) ;
  or (table.date_start > m.date_end)))

Si la fecha final en la tabla puede estar vacía lo que significa un día en la cita, el código podría ser:

(NOT ((table.date_end < m.date_start) ;
  OR (table.date_start > m.date_end))) ;
  OR (table.date_end=={} AND ;
  BETWEEN(table.date_start,m.date_start,m.date_end))

Esta expresión puede ser utilizada en una sentencia SET FILTER TO o en una cláusula WHERE. Si necesita filtrar en un criterio adicional (recursos, etc.) puede agregar esos filtros con AND. La expresión se puede optimizar con Rushmore cuando tiene un índice por date_end y date_start en la tabla.

No hay comentarios. :

Publicar un comentario