PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 13.23 » Langage SQL » Fonctions et opérateurs » Fonctions et opérateurs sur les intervalles

9.20. Fonctions et opérateurs sur les intervalles

Voir Section 8.17 pour un aperçu les types d'intervalle.

Tableau 9.53 montre les opérateurs spécialisés disponibles pour les types d'intervalle. En plus de ces derniers, les opérateurs de comparaison habituels montrés dans Tableau 9.1 sont disponibles pour les types d'intervalle. Les opérateurs de comparaison trient d'abord par les limites basses de l'intervalle et seulement si ces dernières sont identiques, par les limites hautes. Ceci ne donne généralement pas de résultat utile pour un tri, mais les opérateurs sont fournis pour autoriser la création d'index d'unicité sur des intervalles.

Tableau 9.53. Opérateurs sur les intervalles

Opérateur

Description

Exemple(s)

anyrange @> anyrange → boolean

Est-ce que le premier intervalle contient le second ?

int4range(2,4) @> int4range(2,3) → t

anyrange @> anyelement → boolean

Est-ce que l'intervalle contient l'élément ?

'[2011-01-01,2011-03-01)'::tsrange @> '2011-01-10'::timestamp → t

anyrange <@ anyrange → boolean

Est-ce que le premier intervalle est contenu par le second ?

int4range(2,4) <@ int4range(1,7) → t

anyelement <@ anyrange → boolean

Est-ce que l'élément est contenu dans l'intervalle ?

42 <@ int4range(1,7) → f

anyrange && anyrange → boolean

Est-ce que les intervalles se surchargent, c'est-à-dire ont-ils des éléments en commun ?

int8range(3,7) && int8range(4,12) → t

anyrange << anyrange → boolean

Est-ce que le premier intervalle se trouve strictement à gauche du second ?

int8range(1,10) << int8range(100,110) → t

anyrange >> anyrange → boolean

Est-ce que le premier intervalle se trouve strictement à droite du second ?

int8range(50,60) >> int8range(20,30) → t

anyrange &< anyrange → boolean

Est-ce que le premier intervalle ne s'étend pas à droite du second ?

int8range(1,20) &< int8range(18,20) → t

anyrange &> anyrange → boolean

Est-ce que le premier intervalle ne s'étend pas à gauche du second ?

int8range(7,20) &> int8range(5,10) → t

anyrange -|- anyrange → boolean

Les deux intervalles sont-ils adjacents ?

numrange(1.1,2.2) -|- numrange(2.2,3.3) → t

anyrange + anyrange → anyrange

Calcule l'union des intervalles. Les intervalles doivent se surcharger ou être adjacents, pour que l'union soit un intervalle simple (cependant voir range_merge()).

numrange(5,15) + numrange(10,20) → [5,20)

anyrange * anyrange → anyrange

Calcule l'intersection des intervalles.

int8range(5,15) * int8range(10,20) → [10,15)

anyrange - anyrange → anyrange

Calcule la différence des intervalles. Le deuxième intervalle ne doit pas être contenu dans le premier de tel façon que la différence ne formerait pas un intervalle simple.

int8range(5,15) - int8range(10,20) → [5,10)


Les opérateurs gauche-de/droite-de/adjacent renvoient toujours false quand un intervalle vide est impliqué ; autrement dit, un intervalle vide n'est pas considéré être avant ou après tout intervalle.

Tableau 9.54 montre les fonctions disponibles avec les types d'intervalle.

Tableau 9.54. Fonctions d'intervalle

Fonction

Description

Exemple(s)

lower ( anyrange ) → anyelement

Extrait la limite basse de l'intervalle (NULL si l'intervalle est vide ou si la limite basse est infinie).

lower(numrange(1.1,2.2)) → 1.1

upper ( anyrange ) → anyelement

Extrait la limite haute de l'intervalle (NULL si l'intervalle est vide ou si la limite haute est infinie).

upper(numrange(1.1,2.2)) → 2.2

isempty ( anyrange ) → boolean

Est-ce que l'intervalle est vide ?

isempty(numrange(1.1,2.2)) → f

lower_inc ( anyrange ) → boolean

Est-ce que la limite basse de l'intervalle est inclus ?

lower_inc(numrange(1.1,2.2)) → t

upper_inc ( anyrange ) → boolean

Est-ce que la limite haute de l'intervalle est inclus ?

upper_inc(numrange(1.1,2.2)) → f

lower_inf ( anyrange ) → boolean

Est-ce que la limite basse de l'intervalle est infinie ?

lower_inf('(,)'::daterange) → t

upper_inf ( anyrange ) → boolean

Est-ce que la limite haute de l'intervalle est infinie ?

upper_inf('(,)'::daterange) → t

range_merge ( anyrange, anyrange ) → anyrange

Calcule le plus petit intervalle incluant les deux intervalles.

range_merge('[1,2)'::int4range, '[3,4)'::int4range) → [1,4)


Les fonctions lower_inc, upper_inc, lower_inf et upper_inf renvoient toutes false pour un intervalle vide.