2013-03-04 4 views
4

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

Я хочу отобразить таблицу 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 

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

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

EDIT:

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

(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) 

Хотя, для 'два в неделю' и 'ежемесячно' INTERVAL + 2 WEEK/1 МЕСЯЦ, вернет результаты каждые неделя. Как это исправить?

EDIT:

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

EDIT

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

+0

не у вас есть срок действия для 'повторных задач'? Что делать, если вы забыли удалить недопустимые задачи? Поделитесь табличной схемой, 'show create table planner'. – SparKot

ответ

2

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

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)) 
      ); 
+0

Благодарим вас за ответ @SparKot! Я не использую коды эффективности в своей таблице, потому что я не знал об истекших/недопустимых прошлых задачах. Я сменил свой ноутбук на 2040 год, и действительно была ошибка mysql. Я изменил планы, и я думаю, что лучше повторять задание на один год, с возможностью удаления или продления на другой год. – JK87

+0

@ user2131419 Первый вопрос здесь, пожалуйста, прочитайте, что делать [когда вы получите ответы] (http://stackoverflow.com/faq#howtoask). – SparKot

+0

Мои извинения @SparKot, я отредактировал мой вопрос. – JK87

 Смежные вопросы

  • Нет связанных вопросов^_^