PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment tester les dates qui se chevauchent dans PostgreSQL

Dans PostgreSQL, vous pouvez utiliser le OVERLAPS l'opérateur pour tester les périodes de temps qui se chevauchent.

La fonction renvoie true lorsque deux périodes (définies par leurs extrémités) se chevauchent et false lorsqu'elles ne se chevauchent pas.

Syntaxe

Il peut être utilisé des deux manières suivantes :

(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

En d'autres termes, vous fournissez une date/heure de début, puis vous avez la possibilité de fournir une date/heure de fin ou une durée.

Plus précisément, les points de terminaison peuvent être spécifiés sous forme de paires de dates, d'heures ou d'horodatages ; ou sous la forme d'une date, d'une heure ou d'un horodatage suivi d'un intervalle.

Lorsqu'une paire de valeurs est fournie, le début ou la fin peut être écrit en premier ; OVERLAPS prend automatiquement la valeur la plus ancienne de la paire comme valeur de départ.

Exemple

Voici un exemple de base pour illustrer.

SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
       (date '2022-02-09', date '2022-03-10');

Résultat :

True

Le résultat est vrai car les deux périodes se chevauchent.

Le voici à nouveau, mais cette fois, je modifie les périodes de temps pour qu'elles ne se chevauchent pas.

SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
       (date '2022-02-09', date '2022-03-08');

Résultat :

False

Points finaux communs

Il est important de noter que chaque période est considérée comme représentant l'intervalle semi-ouvert start <= time < end , sauf si start et end sont égaux, auquel cas il représente cet instant unique. Cela signifie que deux périodes de temps avec seulement un point de terminaison en commun ne se chevauchent pas.

Dans l'exemple suivant, la deuxième période commence le même jour que la première période se termine.

SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
       (date '2022-02-10', date '2022-03-10');

Résultat :

False

Cependant, nous obtenons un résultat différent si les deux extrémités de la première période sont identiques :

SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
       (date '2022-01-09', date '2022-02-10');

Résultat :

True

Intervalles

Comme mentionné, le deuxième point final peut être un intervalle.

SELECT (date '2022-01-09', interval '32 days') OVERLAPS
       (date '2022-02-09', date '2022-03-10');

Résultat :

True