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