Intervalles
Un intervalle possède un début d et une fin f, tels que d < f.
Les types de plage sont utiles car ils représentent de nombreuses valeurs d’éléments dans une seule valeur de plage et parce que des concepts tels que les plages qui se chevauchent peuvent être exprimés clairement. L’utilisation de plages d’heures et de dates à des fins de planification en est l’exemple le plus clair ; mais les fourchettes de prix, les plages de mesure d'un instrument, etc. peuvent également être utiles.
Les types de plage sont des types de données représentant une plage de valeurs d'un certain type d'élément (appelé sous-type de plage). Par exemple, des plages d’horodatage peuvent être utilisées pour représenter les plages horaires pendant lesquelles une salle de réunion est réservée. Dans ce cas, le type de données est tsrange (abréviation de « timestamp range ») et timestamp est le sous-type.
Types
- int4range : Intervalle d'entier
- int8range : Intervalle d'entier long
- numrange : Intervalle de nombres décimaux
- tsrange : Intervalle d'horodatage sans fuseau horaire
- tstzrange : Intervalle d'horodatage avec fuseau horaire
- daterange : Intervalle de date
Déclaration
A l'aide de fonctions
SELECT int4range(10, 20);
Déclare un intervalle d'entiers enrte 10 inclus et 20 exclus.
En mode textuel
SELECT '[10,20)'::int4range;
Limites inclusives et exclusives
Chaque plage non vide a deux limites, la limite inférieure et la limite supérieure. Tous les points entre ces valeurs sont inclus dans la plage. Une limite inclusive signifie que le point limite lui-même est également inclus dans la plage, tandis qu'une limite exclusive signifie que le point limite n'est pas inclus dans la plage.
Dans la forme textuelle d'une plage, les limites inclusives sont représentées par des crochets [ et ] tandis que les limites exclusives sont représentées par des parenthèses ( et ).
Les fonctions lower_inc et upper_inc testent respectivement l'inclusivité des limites inférieure et supérieure d'une valeur de plage.
Plages infinies (illimitées)
La limite inférieure d'une plage peut être omise, ce qui signifie que toutes les valeurs inférieures à la limite supérieure sont incluses, par exemple (,3). De même, si la limite supérieure de la plage est omise, alors toutes les valeurs supérieures à la limite supérieure de la plage le sont.
Les fonctions lower_inf et upper_inf testent respectivement les limites inférieure et supérieure infinies d'une plage.
Logique d’intervalles d’Allen
Ensemble complet d’opérateurs booléens de base pour le positionnement relatif dans le temps.
Deux intervalles A et B peuvent se positionner selon 13 configurations.
1. Précède
A Précède B lorsque la borne supérieure de A est strictement inférieure à la borne inférieure de B.
| Allen | Postgres |
|---|---|
| A < B | A << B |
select '[3,5]'::int4range << '[8,15]'::int4range;
2. Succède
A Succède à B lorsque la borne inférieure de A est strictement supérieure à la borne supérieure de B.
| Allen | Postgres |
|---|---|
| A > B | A >> B |
select '[8,15]'::int4range >> '[3,5]'::int4range;
L'opérateur Succède (>) est le transposé de l'opérateur Précède (<).
3. Égale
A Égale B lorsque les bornes inférieures et supérieures de chaque intervalle sont égales.
| Allen | Postgres |
|---|---|
| A = B | A = B |
select '[3,10]'::int4range = '[3,10]'::int4range;
L'opérateur Égale (=) est son propre transposé.
4. Rencontre / rejoint
A Rencontre (meets) B lorsque la borne supérieure de A moins la borne inférieure de B est égale à une unité.
| Allen | Postgres |
|---|---|
| A m B | A -|- B |
select '[3,6]'::int4range -|- '[7,14]'::int4range;
L'opérateur Rencontre (m) a comme transposé l'opérateur Rencontré par (mi). i pour inverse.
5. Chevauche / intersecte
A chevauche (overlaps) B lorsque la borne supérieure de A est supérieure à la borne inférieure de B sans que la borne inférieure de A soit supérieure à la borne supérieure de B.
| Allen | Postgres |
|---|---|
| A o B | A && B |
select '[3,8]'::int4range && '[5,14]'::int4range;
L'opérateur Chevauche (o) a comme transposé l'opérateur Est chevauché par (oi). i pour inverse.
6. Pendant
A se déroule Pendant (during) B lorque la borne inférieure de A est supérieure à la borne inférieure de B et que la borne supérieure de A est inférieure à la borne supérieure de B.
| Allen | Postgres |
|---|---|
| A d B | A <@ B |
select '[7,10]'::int4range <@ '[5,14]'::int4range;
L'opérateur Pendant (d) a comme transposé l'opérateur Contient (di). i pour inverse.
7. Contient
A Contient B lorsque la borne inférieure de A est inférieure à la borne inférieure de B et que la borne supérieure de A est supérieure à la borne supérieure de B.
| Allen | Postgres |
|---|---|
| A di B | A @> B |
select '[5,14]'::int4range @> '[7,10]'::int4range;
L'opérateur Contient (di) est le transposé de l'opérateur Pendant (d).
8. Commence
A Commence en même temps (starts) que B lorsque la borne inférieure de A est égale à la borne inférieure de B.
| Allen | Postgres |
|---|---|
| A s B | A &> B |
select '[5,15]'::int4range &> '[5,10]'::int4range;
L'opérateur Commence (s) a comme transposé l'opérateur Débuté par (si). i pour inverse.
9. Finit
A Finit en même temps (finishes) que B lorsque la borne supérieure de A est égale à la borne supérieure de B.
| Allen | Postgres |
|---|---|
| A f B | A &< B |
select '[5,15]'::int4range &< '[10,15]'::int4range;
L'opérateur Finit (f) a comme transposé l'opérateur Terminé par (fi). i pour inverse.
Opérateurs combinatoires
Union
select '[5,10]'::int4range + '[8,15]'::int4range;
Intersection
select '[5,10]'::int4range * '[8,15]'::int4range;
Différence
select '[5,10]'::int4range - '[8,15]'::int4range;