jueves, 21 de febrero de 2013

Detectar colisiones o conflictos de fechas

Hoy mientras probaba una aplicación para un cliente encontré un problema interesante y es ¿cómo validar colisiones de fechas para un calendario? Supongan que tienen que crear una agenda que permita crear eventos como citas o reuniones y deben detectar que dos eventos no ocurran al mismo tiempo, por simplicidad solo digamos que "todos los eventos que sean creados no deben estar en conflicto de horario con los demás" Parece simple de resolver a simple vista pero permítanme mostrar unos ejemplos del motivo por el que no lo es: Supongan que tienen dos eventos A que dura 60 minutos y B que dura 90 minutos. Hay muchas formas en las que podemos crear estos eventos en nuestra agenda de manera que crean un conflicto de horario
  1. Haciendo que A y B inicien a la vez http://screencloud.net/v/ChX3
  2. Haciendo que A inicie unos minutos antes que B http://screencloud.net/v/73vI
  3. Haciendo que B inicie unos minutos antes que A http://screencloud.net/v/uyaG
  4. Haciendo que A inicie unos minutos despues de B http://screencloud.net/v/lpLg
  5. ...
Si tratan de identificar todas las posibles combinaciones en las que A y B entran en conflicto su código puede volverse bastante enorme y problemático a la hora de darle mantenimiento para algo tan simple como "encontrar conflictos de horario", por suerte hay otra forma más sencilla que explico a continuación: En lugar de encontrar las posibles condiciones en las que A y B entran en conflicto busquemos las posibles situaciones en las que no lo están
  1. A inicia y termina antes que B http://screencloud.net/v/hEXt
  2. B inicia y termina antes que A http://screencloud.net/v/tR6X
Podemos usar estas dos condiciones antes mencionadas y un poco de lógica booleana para hacer, por ejemplo una consulta en mysql: Bueno espero que esto les sea de ayuda