4

私は交通計画担当者に取り組んでいます。私のMySQL(i)/ PHPの知識は(非常に)基本的です。

特定の日のすべてのタスクを含むHTMLテーブルを表示したい。ただし、問題は、一部のタスクを(タスク全体を削除するまで)繰り返す必要があるため、タスクの頻度が1回、毎日、毎週、2週間、毎月のようになることです。

もちろん、毎週月曜日に新しいタスクを追加する場合、そのタスクは毎週月曜日にテーブルに戻される必要があります。

次のようなものを組み合わせる必要があります:

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

もしそうなら、どうやって?

誰かが私を助けてくれることを願っています。

編集:

1回、毎日および毎週のタスクの場合、このようなクエリ(おそらくまだ恐ろしい)は次のようになります。

(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週間」および「毎月」の間隔+2週間/1か月の場合、毎週結果が返されます。これを修正する方法は?

編集:

期限切れ/無効な過去のタスクを認識していなかったため、テーブルで有効性列を使用しません。ラップトップの年を2040に変更しましたが、実際にmysqlエラーが発生しました。計画を変更しましたが、繰り返しのタスクは1年間有効で、削除するか、もう1年間延長するかを選択できる方がよいと思います。また、月曜日に月曜日の頻度でタスクを作成すると、そのタスクが翌月の最初の月曜日にテーブルに返されることも忘れました。また、「1回」の頻度のタスクは、ソリューションを試すときに毎日テーブルに表示されます。

編集

@SparKot、通常は月ごとの頻度でタスクが表示されます。たとえば、2013-03-05で、次回は2013-04-05、2013-05-05などになります。このプランナーでは、例として月次タスクが設定されていますが、火曜日2013-03-05は、翌月の最初の火曜日に再表示されます(4月:2013-04-02、5月:2013-05-07、6月: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 に答える