V PostgreSQL můžete použít OVERLAPS operátora, aby otestoval překrývající se časové úseky.
Funkce vrátí hodnotu true, když se dvě časová období (definovaná jejich koncovými body) překrývají, a hodnotu false, pokud se nepřekrývají.
Syntaxe
Lze jej použít následujícími dvěma způsoby:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2) Jinými slovy, zadáte datum/čas zahájení a poté máte možnost zadat datum/čas ukončení nebo délku času.
Konkrétněji mohou být koncové body specifikovány jako dvojice dat, časů nebo časových razítek; nebo jako datum, čas nebo časové razítko následované intervalem.
Je-li zadána dvojice hodnot, lze nejprve zapsat začátek nebo konec; OVERLAPS automaticky vezme dřívější hodnotu páru jako začátek.
Příklad
Zde je základní příklad k demonstraci.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10'); Výsledek:
True
Výsledek je pravdivý, protože obě časová období se překrývají.
Tady je to znovu, ale tentokrát měním časové úseky, aby se nepřekrývaly.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08'); Výsledek:
False
Běžné koncové body
Je důležité poznamenat, že každé časové období je považováno za napůl otevřený interval start <= time < end , pokud start a end jsou stejné, v takovém případě představuje tento jediný časový okamžik. To znamená, že se dvě časová období, která mají společný pouze koncový bod, nepřekrývají.
V dalším příkladu druhé časové období začíná ve stejný den, kdy končí první časové období.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10'); Výsledek:
False
Pokud jsou však oba koncové body prvního časového období stejné, dostaneme jiný výsledek:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10'); Výsledek:
True
Intervaly
Jak bylo zmíněno, druhým koncovým bodem může být interval.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10'); Výsledek:
True