Как справиться с повторяющимися временами? - PullRequest
3 голосов
/ 21 июня 2011

Во-первых, я пометил этот вопрос как независимый от языка, но я использую PHP и MySQL. Это не должно сильно влиять на сам вопрос.

Я создаю приложение, которое показывает время определенных шоу в течение недели. Каждое шоу повторяется (еженедельно), и могут быть шоу, которые будут транслироваться в течение 2 дней, например. начиная с воскресенья в 23:30 и заканчивая в понедельник в 00:30. Я храню начало шоу (день недели - понедельник, вторник ... - это никогда не бывает точной даты; время) и продолжительность. Никогда не было шоу, которое заняло бы больше 24 часов.

Моя проблема с проверкой, если новые добавленные шоу не перекрывают некоторые старые. Особенно, если речь идет о шоу в воскресенье-понедельник.

Как такие повторяющиеся события обычно обрабатываются как на стороне БД, так и на стороне сервера?

tl; dr версия с вещами, которые я рассмотрел

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

Другой альтернативой, которая пришла в голову, было изменение структуры таблицы, чтобы использовать дату и время (вместо «день недели» и «время»), и использовать фиктивный фиксированный диапазон дат для хранения данных. Например, все понедельники будут установлены на 5 января 1970 года, а воскресенья - на 11 января 1970 года. Из этого правила будет одно исключение - если будет какое-то шоу, которое начнется в воскресенье и закончится в понедельник, оно будет сохранено как 12 января 1970. Это решение позволило бы более гибко запрашивать БД, чем исходное, и оно также упростило бы запросы для показов, которые перекрываются между отдельными неделями (поскольку мы можем сделать сравнение непосредственно в запросе). У этого решения также есть некоторые недостатки (например, использование фиктивных дат может привести к путанице).

Оба решения для меня пахнут неверными алгоритмами, и хотелось бы услышать мнения более опытных коллег-разработчиков.

Ответы [ 3 ]

6 голосов
/ 21 июня 2011

Звучит так, как если бы вы могли просто сохранить начальную минуту каждого шоу в виде целого числа минут с начала недели (10 080 возможных значений).

Затем шоу началось с минуты $a с продолжительностью.$dur_a будет перекрываться $b тогда и только тогда, когда

(10080 + $b - $a) % 10080 < $dur_a

Например, рассмотрим шоу, начинающееся в 11 вечера воскресенья, а другое, начинающееся в 12:30 утра понедельника.Здесь $a == 10020 и $dur_a == 120 и $b == 30.(10080 + $b - $a) % 10080 == 90.Это меньше, чем $dur_a, и, следовательно, шоу перекрываются.

1 голос
/ 21 июня 2011

Эту проблему можно упростить, если преобразовать данные в формат, подходящий для требуемых расчетов.Я рекомендую создать тип, который представляет время начала как количество минут с воскресенья до полуночи.Затем можно использовать простые сравнения целочисленных диапазонов для поиска перекрывающихся шоу.

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

0 голосов
/ 21 июня 2011

Я бы выбрал собственный алгоритм проверки:

  • Для каждого шоу рассчитать все показанные интервалы [start1, end1], [start2, end2], ... [startN, endN], где N - номер повторения шоу.
  • Для нового шоу также вычислите эти интервалы.
  • Теперь проверьте, пересекаются ли какие-либо из этих новых интервалов со старыми. Это тот случай, если начало или конец одного интервала содержится в другом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...