MySQL: планировщик транспорта с повторяющимися задачами

Я работаю над транспортным планировщиком. Мои знания MySQL(i)/PHP (очень) базовые.

Я хочу отобразить таблицу HTML со всеми задачами определенного дня. Но проблема в том, что некоторые задачи нужно повторять (пока я не удалю всю задачу), поэтому у задач есть частота: один раз, ежедневно, еженедельно, раз в две недели и ежемесячно.

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

Должен ли я комбинировать что-то вроде:

SELECT * FROM planner 
         WHERE frequency = `once` 
         AND date = CURDATE()

SELECT * FROM planner 
         WHERE frequency = `daily/weekly/two-weekly/monthly/yearly` 
         AND day = DAYOFWEEK(CURDATE())
         AND date + INTERVAL 1 DAY/1 WEEK/2 WEEK/1 MONTH

И если да, то как тогда?

Надеюсь, кто-нибудь может мне помочь.

ИЗМЕНИТЬ:

На этот раз для ежедневных и еженедельных задач подойдет такой запрос (вероятно, все еще ужасный):

(SELECT *
        FROM planner 
        WHERE frequency = 'once' 
        AND date = NOW())
UNION
(SELECT *
        FROM planner 
        WHERE frequency = 'daily' 
        AND date + INTERVAL 1 DAY)
UNION
(SELECT *
        FROM planner
        WHERE frequency = 'weekly' 
        AND day = DAYOFWEEK(CURDATE()) 
        AND date + INTERVAL 1 WEEK)

Хотя для "две недели" и "ежемесячно" ИНТЕРВАЛ + 2 НЕДЕЛИ / 1 МЕСЯЦ будут возвращаться результаты каждую неделю. Как это исправить?

ИЗМЕНИТЬ:

Я не использую столбцы достоверности в своей таблице, потому что я не знал о просроченных/недействительных прошлых задачах. Я изменил год своего ноутбука на 2040, и действительно была ошибка mysql. Я изменил планы, и я думаю, что лучше, чтобы повторяющаяся задача была действительна в течение одного года с возможностью удаления или продления еще на один год. Затем я также забыл упомянуть, что когда я создаю задачу в понедельник с месячной частотой, задача возвращается в мою таблицу в первый понедельник следующего месяца. Также задачи с частотой «один раз» появляются в моей таблице каждый день, когда я пробую ваше решение.

ИЗМЕНИТЬ

@SparKot, обычно с ежемесячной периодичностью задача просматривается, например, 2013-03-05, а в следующий раз будет 2013-04-05, 2013-05-05 и так далее. Хотя в этом планировщике поставлена ​​ежемесячная задача, например, вторник 2013-03-05 должен снова появиться в первый вторник следующего месяца (апрель: 2013-04-02, май: 2013-05-07, июнь: 2013-06- 04).


person JK87    schedule 04.03.2013    source источник
comment
у вас нет срока действия repeating tasks? Что делать, если вы забыли удалить недействительные задачи? Пожалуйста, поделитесь схемой таблицы, show create table planner.   -  person SparKot    schedule 04.03.2013


Ответы (1)


Предполагая, что в таблице есть столбцы достоверности:

SELECT *
  FROM planner
 WHERE     now() >= valid_from
       AND now() <= valid_to
       AND (frequency = 'daily'
            OR (frequency = 'once' AND date(now()) = date)
            OR (frequency = 'weekly' AND 0 = (abs(datediff(now(), date)) % 7))
            OR (frequency = 'two-weekly' AND 0 = (abs(datediff(now(), date)) % 14))
            OR (frequency = 'monthly' 
                AND ceil(dayofmonth(now())/7) = ceil(dayofmonth(date)/7)
                AND dayofweek(now()) = dayofweek(date))
            );

Без столбцов достоверности: вы можете получить просроченные/недействительные прошлые задачи, которые еще не удалены:

SELECT *
  FROM planner
 WHERE (frequency = 'daily'
            OR (frequency = 'once' AND date(now()) = date)
            OR (frequency = 'weekly' AND 0 = (abs(datediff(now(), date)) % 7))
            OR (frequency = 'two-weekly' AND 0 = (abs(datediff(now(), date)) % 14))
            OR (frequency = 'monthly' 
                AND ceil(dayofmonth(now())/7) = ceil(dayofmonth(date)/7)
                AND dayofweek(now()) = dayofweek(date))
            );
person SparKot    schedule 04.03.2013
comment
Спасибо за ваш ответ @SparKot! Я не использую столбцы достоверности в своей таблице, потому что я не знал о просроченных/недействительных прошлых задачах. Я изменил год своего ноутбука на 2040, и действительно была ошибка mysql. Я изменил планы, и я думаю, что лучше, чтобы повторяющаяся задача была действительна в течение одного года с возможностью удаления или продления еще на один год. - person JK87; 05.03.2013
comment
@user2131419 user2131419 Первый вопрос здесь, пожалуйста, прочитайте, что делать, когда вы получите ответы. - person SparKot; 05.03.2013
comment
once частота должна быть исправлена. Что не так с частотой monthly? - person SparKot; 05.03.2013
comment
Теперь все должно быть в порядке согласно вашему определению частоты monthly. - person SparKot; 05.03.2013
comment
Можно ли настроить запрос решения таким образом, чтобы задачи не отображались по субботам и воскресеньям, если это возможно? - person JK87; 12.03.2013