проверить перекрытие времени (ruby / mysql) - PullRequest
0 голосов
/ 22 марта 2011

У меня есть 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 голос
/ 22 марта 2011

логически

  • ни время начала, ни время окончания вашей тестируемой записи не должно быть между временем начала и конца любой записи базы данных - это будет охватывать любое частичное и внутреннее перекрытие
  • Внешнее перекрытие обнаруживается, если test_start 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 голосов
/ 18 апреля 2011

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

https://github.com/robinbortlik/validates_overlap

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

ура

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

0 голосов
/ 22 марта 2011
select start_time, end_time
from tbl
where start_time < "00:00:20"
  and "00:00:10" < end_time
limit 1;

Примечания:

  1. Limit 1 используется для быстрого возврата результата, без необходимости находить / считать все совпадения
  2. двойной старт
  3. при обнаружении перекрытия выводится примерная запись перекрытия
0 голосов
/ 22 марта 2011

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

ура

Пол

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...