English

Manual de campo · trampas de SQL

¿Cuándo se solapan de verdad dos intervalos de tiempo?

Comparar sólo el inicio o sólo el fin no basta, y usar <= en vez de < convierte dos turnos que se tocan en un punto en un solape que no existe.

Cuándo aparece

Coartadas, turnos, reservas, posiciones abiertas, ventanas de mantenimiento: cualquier pregunta de '¿estos dos periodos coinciden?'.

Ejemplo

Mal: <= en vez de <, un solape que no era tal

SELECT a.persona, b.persona
FROM turnos a
JOIN turnos b
  ON a.persona <> b.persona
 AND a.desde <= b.hasta
 AND b.desde <= a.hasta;
-- con <=, dos turnos que se tocan en el mismo instante
-- (uno termina justo cuando el otro empieza) cuentan como solape

Bien: dos comparaciones con < estricto cubren los cuatro casos

SELECT a.persona, b.persona
FROM turnos a
JOIN turnos b
  ON a.persona <> b.persona
 AND a.desde < b.hasta
 AND b.desde < a.hasta;

a1 < b2 AND b1 < a2 cubre los cuatro solapes posibles (empieza dentro, acaba dentro, contiene, está contenido) sin necesidad de enumerarlos por separado; es el patrón que vale para siempre. La única decisión real es < frente a <=: con <=, un turno que termina a las 22:00 y otro que empieza a las 22:00 cuentan como solapados, aunque en la práctica no coincidieron ni un segundo. Cuál de los dos usar depende del dominio: dos reservas de sala que se tocan en el minuto exacto normalmente no chocan (< estricto); dos rangos de vigencia de precio donde el fin es inclusivo sí podrían necesitar <=. La regla no es 'usa siempre <': es 'decide primero si el instante límite pertenece a los dos intervalos o a ninguno'.

Esta trampa está escondida en un caso de verdad, con datos de verdad.

Jugar el caso 1 gratis →

Trampas relacionadas