Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Porównanie zakresów dat

To klasyczny problem, który jest łatwiejszy, jeśli odwrócisz logikę.

Podam przykład.

Opublikuję tutaj jeden okres i wszystkie różne odmiany innych okresów, które w jakiś sposób się pokrywają.

           |-------------------|          compare to this one
               |---------|                contained within
           |----------|                   contained within, equal start
                   |-----------|          contained within, equal end
           |-------------------|          contained within, equal start+end
     |------------|                       not fully contained, overlaps start
                   |---------------|      not fully contained, overlaps end
     |-------------------------|          overlaps start, bigger
           |-----------------------|      overlaps end, bigger
     |------------------------------|     overlaps entire period

z drugiej strony pozwolę sobie opublikować wszystkie te, które się nie pokrywają:

           |-------------------|          compare to this one
     |---|                                ends before
                                 |---|    starts after

Więc jeśli po prostu zmniejszysz porównanie do:

starts after end
ends before start

wtedy znajdziesz wszystkie te, które się nie pokrywają, a następnie wszystkie niepasujące okresy.

W ostatnim przykładzie NIE NA LIŚCIE możesz zobaczyć, że pasuje on do tych dwóch zasad.

Musisz zdecydować, czy następujące okresy znajdują się W, czy POZA zakresami:

           |-------------|
   |-------|                       equal end with start of comparison period
                         |-----|   equal start with end of comparison period

Jeśli Twoja tabela zawiera kolumny o nazwach range_end i range_start, oto prosty kod SQL do pobrania wszystkich pasujących wierszy:

SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
           OR range_end < @check_period_start)

Zwróć uwagę na NIE tam. Ponieważ dwie proste reguły znajdują wszystkie niepasujące wierszy, proste NIE odwróci go, aby powiedzieć:jeśli nie jest to jeden z niepasujących wierszy, musi to być jeden z pasujących .

Zastosuj tutaj prostą logikę odwrócenia, aby pozbyć się NIE, a otrzymasz:

SELECT *
FROM periods
WHERE range_start <= @check_period_end
      AND range_end >= @check_period_start


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL usuwa znaki nieliczbowe do porównania

  2. Jak wdrożyć Percona Server dla MySQL w celu zapewnienia wysokiej dostępności

  3. Jak uzyskać identyfikator ostatniego zaktualizowanego wiersza w MySQL?

  4. Rozwiązywanie problemów z replikacją MySQL:część druga

  5. Dynamicznie twórz obiekt PHP na podstawie napisu