Учитывая эту модель: системные расписания и при условии, что в БД было несколько событий с различными комбинациями повторяемости: ежедневно, ежедневно каждые 3 дня, еженедельно по вторникам. каждые 2 недели, ежемесячно 28 числа, ежемесячно второго вторника каждые 2 месяца, ежегодно 28 февраля и т. д.
В приведенной модели есть определенные поля, которые сразу приходят на ум:
- freq_type, чтобы узнать, является ли четным ежедневно, еженедельно, ежемесячно и т. д.
- freq_interval, чтобы определить интервал на основе freq_type.
- freq_relative_interval, чтобы определить, происходят ли события 1-го, 2-го, 3-го и т. д. месяца.
- freq_recurrence_factor для определения еженедельного/месячного интервала между событиями.
Если бы я хотел запросить все события сегодняшнего дня, вторник, 28 февраля 2012 г.... как бы это выглядело?
Обновление Вот что я придумал на данный момент (в этом примере я хочу, чтобы все "события" происходили 28 февраля (это вторник): SELECT * FROM TableName WHERE (freq_type = 1 && active_start_date = '2012-02-28') OR (freq_type = 4) OR (freq_type = 8 && freq_interval = 4) OR (freq_type = 32 && freq_interval = 3 && freq_relative_interval = 16)
- freq_type 1 означает, что это только один раз, получить по active_start_date
- freq_type из 4 означает ежедневно, получать все, так как они происходят и в этот день
- freq_type из 8 означает еженедельно, получать эти события в freq_interval 4 (вторник)
- freq_type из 32 означает ежемесячно, относительный - freq_interval 3 (вторник), freq_relative_interval 16 для последнего
Вот что сразу приходит на ум как «неправильно».
1. Что делать с мероприятиями, которые проводятся еженедельно, но более одного дня, включая вторник? Например, еженедельное событие, которое происходит каждый вторник/четверг, будет иметь freq_interval, равное 20. Как мне переписать приведенный выше запрос, чтобы учесть все возможные комбинации freq_interval, которые могут быть вторниками?
2. А как насчет событий, которые происходят каждые n недель/месяцев? Как я узнаю, является ли эта неделя/месяц включенным или выключенным временным интервалом?