4

我正在研究交通规划师。我的 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)

虽然,对于“两周一次”和“每月一次”INTERVAL + 2 WEEK / 1 MONTH,每周都会返回结果。如何解决这个问题?

编辑:

我不在表中使用有效性列,因为我不知道过去的过期/无效任务。我将笔记本电脑年份更改为 2040 年,确实存在 mysql 错误。我改变了计划,我认为重复任务最好在一年内有效,可以选择删除或延长一年。然后我也忘了提到,当我在星期一创建一个每月频率的任务时,该任务在下个月的第一个星期一返回到我的表中。当我尝试您的解决方案时,每天都会出现“一次”频率的任务。

编辑

@SparKot,通常每月查看任务的频率,例如,2013-03-05,下一次是 2013-04-05、2013-05-05 等等。尽管在此计划器中设置了每月任务示例,但 2013-03-05 星期二应该会在下个月的第一个星期二重新出现(四月:2013-04-02,五月:2013-05-07,六月:2013-06- 04)。

4

1 回答 1

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))
            );
于 2013-03-04T19:40:39.193 回答