sql >> Databáze >  >> RDS >> PostgreSQL

Jak testovat překrývající se data v PostgreSQL

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

  1. Nelze se připojit k serveru PostgreSQL:nelze se připojit k serveru:Oprávnění odepřeno

  2. Získat řádek, kde sloupec datetime =dnes - SQL server noob

  3. Pomalý start MySQL v režimu GTID? Problémem může být velikost binárního souboru protokolu

  4. Zřetězení řetězců SQL Server s hodnotou Null