イベントやリマインダーをスケジュールできる ajax Web カレンダーを開発しています。
スキーマ
id INT
title VARCHAR
startdate TIMESTAMP
endtime TIME
enddate DATE
kind INT
reminder INT DEFAULT 0
説明
「kind」フィールドは、「one time」、「daily」、「workdays」、「weekly」、「monthly」、「yearly」として 0、1、2、3、4、5 のいずれかになります。
startdate
「リマインダー」フィールドは分単位で、リマインダーがリマインダーを開始する何分前にすべきかを意味します
「進行中」のイベントとリマインダーを選択する必要があります(両方を混在させても問題ありません... PHPで種類「実際のイベント」/「リマインダー」を分割します)
ザ・セレクト
この SELECT では、「1 回」(0) と「毎日」(1) の種類のスケジュールのみを考慮します... (わかりやすいように)
SELECT *
FROM calendar
WHERE
enddate >= NOW()
AND
(
(
NOW() >= startdate
AND kind=0
AND CURDATE() = DATE(startdate)
AND CURTIME() <= endtime
)
OR
(
NOW() >= startdate
AND kind=1
AND CURTIME() >= TIME(startdate)
AND CURTIME() <= endtime
)
OR
(
NOW() >= DATE_SUB(startdate, INTERVAL reminder MINUTE)
AND NOW() < startdate
)
)
問題
リマインダーはDATE_SUB (開始日、INTERVALリマインダーMINUTE)の数**reminder**
分前に機能するため、イベントと「1回限り」のリマインダーの選択に問題はありません**startdate**
ご覧のとおり、SELECT は最初のスケジュールの後に kind=1 のリマインダーを見逃しています。これは、繰り返しが「開始日と終了日の間で毎日」を意味し、リマインダー自体が表示されるように繰り返す必要があるためです。
次のスケジュール日/時刻を取得して を減算する必要があることはわかって**reminder**
いますが、今まで正しい解決策が見つかりませんでした... (「完全な」SELECT には、平日/週/月/年の種類のスケジュールが必要であることを思い出してください。他の種類のスケジュールにマージするために適切な sql 部分が必要になるよりも... しかし、この特定の質問については、私が話していることを理解するのを難しくしないように、毎日のリマインダーに制限しています! :D )
これを解決するには?お願い助けて :(