PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да валидирате припокриващи се времена в Rails с postgresql

Не е необходимо да преоткривате колелото в PostgreSQL, има два внедрени прости метода за постигане на проверки за припокриване:

  1. SQL OVERLAPS оператор :

Достатъчно просто,

where("(start_at, end_at) OVERLAPS (?, ?)", range.first, range.last)

Това обаче позволява един диапазон да бъде точно след другия
(с други думи, той проверява начало <=време <край ).

  1. Типове диапазони' && (припокриване) оператор :

Обикновено това също е просто. Но PostgreSQL няма вграден тип диапазон за time (има обаче tsrange , tstzrange и daterange за другите темпорални типове).

Трябва да създадете този тип диапазон за себе си:

CREATE TYPE timerange AS RANGE (subtype = time);

Но след това можете да проверите припокриването с

where("timerange(start_at, end_at) && timerange(?, ?)", range.first, range.last)

Предимства на типовете обхват:

  • можете да контролирате себе си, как искате да се справите с границите на диапазон

    е.пр. можете да използвате timerange(start_at, end_at, '[]') за да включи както началната, така и крайната точка на диапазоните. По подразбиране включва началото, но изключва крайната точка на диапазоните.

  • може да се индексира, напр. с

    CREATE INDEX events_times_idx ON events USING GIST (timerange(start_at, end_at));
    
  • Ограничения за изключване :това по същество е същото, което искате да постигнете, но ще бъде наложено на ниво DB (като UNIQUE или всякакви други ограничения):

    ALTER TABLE events
      ADD CONSTRAINT events_exclude_overlapping
      EXCLUDE USING GIST (timerange(start_at, end_at) WITH &&);
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генерирайте времеви редове с ежедневна статистика, като използвате заявка на PostgreSQL

  2. Групирайте по и добавете колони

  3. Как да изпълнявате sql файлове със заявки чрез RPostgreSQL

  4. Изпълнение на sql скриптове с взаимозависимости

  5. Сложна заявка на Postgres