El blog de SQLpro

, Author

Aquí hay varias formas de escribir una función de solapamiento de intervalos para MS SQL Server.
La prueba de solapamiento de intervalos le permite saber, por ejemplo, si dos períodos se solapan. Esto es a veces esencial en la gestión de horarios para evitar que la misma persona tenga que estar presente en dos lugares diferentes al mismo tiempo o que el mismo lugar esté ocupado al mismo tiempo…
Hay una función SQL prevista para esto de los no-OVERLAPS en el estándar SQL. Sin embargo, escribir esta función puede influir mucho en el rendimiento. Es por ello que veremos diferentes formas de dicha escritura.

AVISO: no se consideran solapados un intervalo que comienza o el anterior terminado (igualdad de los límites «fin» del anterior y «comienzo» del siguiente). En efecto, por principio se considera que los intervalos tienen todos límites cerrados a la izquierda y abiertos a la derecha -].

Intervalos que se solapan
Intervalos que se solapan
Intervalos que no se solapan
Intervalos que no se solapan

0 – La formulación del predicado normativo SOLAPES es la siguiente:

::=
::=
::= OVERLAPS
::=
::=

Reglas generales
1) Si el valor del predicado del valor de la fila 1 es el valor nulo o el valor del predicado del valor de la fila 2 es el valor
nulo, el resultado del predicado de solapamiento es Desconocido y no se aplican las demás reglas generales de esta
subcláusula.
2) Sea D1 el valor del primer campo del predicando del valor de la fila 1 y D2 el valor del primer campo del predicando del valor de la fila 2.
3) Caso:
a) Si el tipo más específico del segundo campo del predicando del valor de la fila 1 es un tipo de dato datetime, entonces
deje que E1 sea el valor del segundo campo del predicando del valor de la fila 1.
b) Si el tipo más específico del segundo campo del valor de la fila predicando 1 es INTERVALO, entonces deje que I1 sea
el valor del segundo campo del valor de la fila predicando 1. Deje que E1 = D1 + I1.
4) Si D1 es el valor nulo o si E1 inf D1, entonces deje que S1 = E1 y deje que T1 = D1. En caso contrario, deje que S1 = D1 y que T1
= E1.
5) Caso:
a) Si el tipo más específico del segundo campo del valor de la fila predicando 2 es un tipo de dato datetime, entonces
deje que E2 sea el valor del segundo campo del valor de la fila predicando 2.
b) Si el tipo más específico del segundo campo del valor de la fila predicando 2 es INTERVALO, entonces deje que I2 sea
el valor del segundo campo del valor de la fila predicando 2. Sea E2 = D2 + I2.
6) Si D2 es el valor nulo o si E2 inf D2, entonces sea S2 = E2 y sea T2 = D2. En caso contrario, que S2 = D2 y que T2
= E2.
7) El resultado del predicado de solapamiento es el resultado de la siguiente expresión:

( S1 > S2 AND NOT ( S1 >= T2 AND T1 >= T2 )
OR
( S2 > S1 AND NOT ( S2 >= T1 AND T2 >= T1 ) )
OR
( S1 = S2 AND ( T1 T2 OR T1 = T2 )

NOTA : el término inf étant le caractère :
<

Esta definición incluye un problema que es que un intervalo puede tener un borne indeterminado, por ejemplo provenir de un pasaje lointain, como no saber cuándo se va a terminar y en los dos casos, uno de los bornes puede ser NULL (voire les deux).

Intervalos con límites abiertos superpuestos
Intervalos con límites abiertos superpuestos
Intervalos con límites abiertos no superpuestos
Intervalos con límites abiertos no superpuestos

1 – prueba de superposición para MS SQL Server:

CREATE FUNCTION dbo.f_overlaps (@i1_begin DATETIME2(0), @i1_end DATETIME2(0),
@i2_begin DATETIME2(0), @i2_end DATETIME2(0))
RETURNS BIT
AS
BEGIN
/* Nous suposons qu'aucun défaut de coordination de temps n'est possible (contrainte CHECK dans la table). Si ce n'est pas le cas :
IF @i1_begin > @i1_end RETURN NULL;
IF @i2_begin > @i2_end RETURN NULL;
*/
-- pas de chevauchement si l'un des intervalle est avant ou après l'autre :
IF @i2_begin >= @i1_end RETURN 0;
IF @i2_end <= @i1_begin RETURN 0;
-- sinon, chevauchement :
RETURN 1;
END;
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Microsoft SQL Server MVP

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *