sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan testes for overlappende datoer i PostgreSQL

I PostgreSQL kan du bruge OVERLAPS operatør til at teste for overlappende tidsperioder.

Funktionen returnerer sand, når to tidsperioder (defineret af deres endepunkter) overlapper hinanden, og falsk, når de ikke overlapper hinanden.

Syntaks

Det kan bruges på følgende to måder:

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

Med andre ord, du angiver en startdato/tid, så har du mulighed for at angive enten en slutdato/tid eller et tidsrum.

Mere specifikt kan endepunkterne angives som par af datoer, tidspunkter eller tidsstempler; eller som en dato, et klokkeslæt eller et tidsstempel efterfulgt af et interval.

Når et par værdier er angivet, kan enten starten eller slutningen skrives først; OVERLAPS tager automatisk den tidligere værdi af parret som start.

Eksempel

Her er et grundlæggende eksempel at demonstrere.

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

Resultat:

True

Resultatet er sandt, fordi begge tidsperioder overlapper hinanden.

Her er det igen, men denne gang ændrer jeg tidsperioderne, så de ikke overlapper hinanden.

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

Resultat:

False

Fælles slutpunkter

Det er vigtigt at bemærke, at hver tidsperiode anses for at repræsentere det halvåbne interval start <= time < end , medmindre start og end er ens, i hvilket tilfælde det repræsenterer det enkelte tidsøjeblik. Det betyder, at to tidsperioder med kun et endepunkt til fælles ikke overlapper hinanden.

I det næste eksempel starter den anden tidsperiode samme dag, som den første tidsperiode slutter.

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

Resultat:

False

Vi får dog et andet resultat, hvis begge slutpunkter i den første tidsperiode er ens:

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

Resultat:

True

Intervaller

Som nævnt kan det andet slutpunkt være et interval.

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

Resultat:

True

  1. pyodbc.connect() virker, men ikke sqlalchemy.create_engine().connect()

  2. Postgres:hvordan runder du et tidsstempel op eller ned til nærmeste minut?

  3. Valgfrie argumenter i WHERE-klausulen

  4. proxysql-admin Alternativer - ClusterControl ProxySQL GUI