проверить перекрытие времени (ruby / mysql)

0

У меня есть 2 столбца: start_time и end_time, которые выглядят так: "00:00:05", "00:00:10" (время mysql).

Мой вопрос следует. Как я могу проверить, что одна запись не перекрывает какую-либо другую запись уже в таблице, так что она уникальна, например:

"00:00:10", "00:00:20" перекрывается "00:00:05", "00:00:15"

Спасибо

4 ответа

1
Лучший ответ

логически

  • ни начальное, ни конечное время вашей тестируемой записи не должно быть между начальным и конечным временем любой записи базы данных - это будет охватывать любое частичное перекрытие, а также внутреннее перекрытие.
  • Наружное перекрытие обнаруживается, если test_start < db_start И test_end > db_end

В SQL я бы сформулировал

SELECT count(*) FROM Tab as T WHERE
   :param_start BETWEEN T.start_time AND T.end_time OR
   :param_end   BETWEEN T.start_time AND T.end_time OR
   (:param_start <= T.start_time AND
    :param_end >= T.end_time
   )

если счетчик < > 0, у вас есть перекрытие

  • 0
    спасибо, я думаю, это то, что я ищу. не знал о МЕЖДУ.
  • 1
    @cezar между не является перекрытием, если у вас 0-5 и 5-10, это сообщает об этом как о "перекрытии", когда на самом деле они рядом друг с другом
Показать ещё 3 комментария
0

Я написал драгоценный камень, который поможет вам решить эту проблему.

https://github.com/robinbortlik/validates_overlap

В readme приведен пример использования. Но в это время это только для Rails 3.

веселит

Робин Бортлик

0
select start_time, end_time
from tbl
where start_time < "00:00:20"
  and "00:00:10" < end_time
limit 1;

Примечания:

  • Limit 1 используется для быстрого возврата результата без необходимости поиска/подсчета всех перекрытий
  • Двойной запуск
  • когда обнаружено совпадение, выводится образец перекрывающейся записи
0

Любая запись, поступающая в базу данных, по своей природе будет уникальной. Если вы пытаетесь проверить уникальные атрибуты, например "login", вы должны добавить строку "validates: login,: uniqueness = > true" модели, но также и в файл миграции, вам нужно добавить следующее line 't.string: login,: unique = > true'... Это предотвращает любое перекрытие

веселит

Пол

Ещё вопросы

Сообщество Overcoder
Наверх
Меню