PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zweryfikować nakładające się czasy w Railsach za pomocą postgresql

Nie musisz wymyślać koła na nowo w PostgreSQL, istnieją dwie zaimplementowane proste metody uzyskania kontroli nakładania się:

  1. SQL OVERLAPS operator :

Wystarczająco proste,

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

Dzięki temu jeden zakres może być dokładnie po drugim
(innymi słowy, sprawdza start <=czas ).

  1. Typy zakresów' && (nakłada się) operator :

To też jest zwykle proste. Ale PostgreSQL nie ma wbudowanego typu zakresu dla time (jednak istnieją tsrange , tstzrange i daterange dla innych typów czasowych).

Musisz stworzyć ten typ zakresu dla siebie:

CREATE TYPE timerange AS RANGE (subtype = time);

Ale potem możesz sprawdzić nakładanie się za pomocą

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

Plusy typów zasięgu:

  • możesz kontrolować siebie, jak chcesz radzić sobie z granicami zasięgu

    np. możesz użyć timerange(start_at, end_at, '[]') aby uwzględnić zarówno początek, jak i koniec zakresów. Domyślnie zawiera początek, ale wyklucza punkt końcowy zakresów.

  • może być indeksowany, np. z

    CREATE INDEX events_times_idx ON events USING GIST (timerange(start_at, end_at));
    
  • Ograniczenia wykluczenia :jest to zasadniczo to samo, co chcesz osiągnąć, ale będzie to egzekwowane na poziomie bazy danych (np. UNIQUE lub inne ograniczenia):

    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. Getter i setter Pythona poprzez @property w definicji klasy modelu SqlAlchemy:HOWTO

  2. wzorce migracji danych produkcyjnych w ciągłej dostawie

  3. Czy PLV8 obsługuje wykonywanie połączeń http do innych serwerów?

  4. Czy obserwujesz spadek wydajności PostgreSQL TEMP TABLE od wersji 8.3?

  5. Jak porównać 2 kolejne wartości wierszy w obiekcie wyniku za pomocą Pythona?