Лучший способ сохранить еженедельное событие в MySQL?

У меня есть таблица еженедельных событий, которые работают на определенных днях недели (например, MTWTh, MWF, и т.д.) и работают на определенном времени (например, 8:00 - 17:00). Что лучший способ состоит в том, чтобы сохранить день информации недели в MySQL для создания получения и работы с данными самыми легкими? Мое приложение CakePHP испытывает необходимость для получения всего случая событий NOW().

В течение времени суток я просто использовал бы ВРЕМЯ. В течение многих дней недели я рассматривал 7-разрядное битовое поле, varchar (соглашение о типе "MTWThFr") в течение дней недели, но оба из тех походят на неуклюжие решения (varchar быть более неуклюжим).

Какие-либо предложения?

8
задан erjiang 14 May 2010 в 17:46
поделиться

5 ответов

Вот простой способ:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

Как использовать:

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

Напомним:

Запускать каждый четверг:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  0   0   0   1   0   0   0   14-01-2010    14-01-2033

Запускать каждый четверг и понедельник:

EventID Title    Mon Tue Wed Thu Fri Sat Sun BeginningDate EndDate
1       MyEvent  1   0   0   1   0   0   0   14-01-2010    14-01-2033

Более того, вы получаете только одну строку на расписание событий, что проще и понятнее для программной обработки.

Например, чтобы найти все события, которые должны быть выполнены в понедельник, выполните:

select * from Events where Mon = 1
10
ответ дан 5 December 2019 в 10:39
поделиться

Можете ли вы добавить столбец DayOfWeek в свою таблицу и сделать его целым? Допустимые значения для этого будут от 1 до 7. Вы можете добавить ограничение, чтобы обеспечить соблюдение этого правила. Что касается времени, как насчет столбцов BeginTime и EndTime? Они также будут целыми числами 0-24

Для события в 17:00 в понедельник в вашей таблице будет выглядеть так

Event_ID DayOfWeek BeginTime EndTime
1        2         1700      1800
4
ответ дан 5 December 2019 в 10:39
поделиться

Поскольку не будет придумано никаких новых дней недели (я надеюсь!), вы можете просто создать bool-столбец для каждого дня. Тогда, если вы выполняете запрос для поиска событий в пятницу, это будет просто (с небольшим псевдокодом):

SELECT eventName
FROM events
WHERE fridayBool = true
AND eventStartTime < NOW()
AND eventEndTime > NOW();

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

Не самый элегантный вариант, но он должен работать.

Редактирование...

Example table columns:

  • eventID
  • eventName
  • eventStartTime
  • eventEndTime
  • sundayBool
  • mondayBool
  • ...
  • saturdayBool
0
ответ дан 5 December 2019 в 10:39
поделиться

Разбейте недельную информацию в отдельную таблицу:

events: id, beginTime, endTime, name, description
eventsbyday: id, dayofweek, event_id

Это позволит вам запрашивать eventsbyday в соответствии с текущим днем недели:

SELECT events.name, events.beginTime, events.endTime FROM eventsbyday JOIN events ON eventsbyday.event_id=events.id WHERE dayofweek=0

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

0
ответ дан 5 December 2019 в 10:39
поделиться

Почему бы не сделать несколько строк, в каждой из которых будет только один столбец, содержащий день недели. Этот столбец был бы простым :

ENUM("Monday", "Tuesday", ...)

Затем в PHP вы могли бы использовать функции date и strtotime для получения названия дня :

echo date('l');
echo date('l', strtotime('mon'));
// Outputs "Monday"

Гораздо удобнее хранить название дня.

1
ответ дан 5 December 2019 в 10:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: