En PostgreSQL, puede usar OVERLAPS
operador para probar los períodos de tiempo superpuestos.
La función devuelve verdadero cuando dos períodos de tiempo (definidos por sus extremos) se superponen y falso cuando no se superponen.
Sintaxis
Se puede utilizar de las dos formas siguientes:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
En otras palabras, proporciona una fecha/hora de inicio, luego tiene la opción de proporcionar una fecha/hora de finalización o un período de tiempo.
Más específicamente, los puntos finales se pueden especificar como pares de fechas, horas o marcas de tiempo; o como fecha, hora o marca de tiempo seguida de un intervalo.
Cuando se proporciona un par de valores, se puede escribir primero el inicio o el final; OVERLAPS
toma automáticamente el valor anterior del par como inicio.
Ejemplo
Aquí hay un ejemplo básico para demostrarlo.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultado:
True
El resultado es verdadero porque ambos períodos de tiempo se superponen.
Aquí está de nuevo, pero esta vez cambio los períodos de tiempo para que no se superpongan.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Resultado:
False
Puntos finales comunes
Es importante tener en cuenta que cada período de tiempo se considera que representa el intervalo semiabierto start
<=
time
<
end
, a menos que start
y end
son iguales en cuyo caso representa ese único instante de tiempo. Esto significa que dos períodos de tiempo con solo un punto final en común no se superponen.
En el siguiente ejemplo, el segundo período de tiempo comienza el mismo día que finaliza el primer período de tiempo.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Resultado:
False
Sin embargo, obtenemos un resultado diferente si ambos puntos finales del primer período son iguales:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Resultado:
True
Intervalos
Como se mencionó, el segundo punto final puede ser un intervalo.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultado:
True