我正在开发一个可以安排事件和提醒的 ajax 网络日历。
架构
id INT
title VARCHAR
startdate TIMESTAMP
endtime TIME
enddate DATE
kind INT
reminder INT DEFAULT 0
说明
"kind" 字段可以是 0,1,2,3,4,5 作为 "one time","daily","workdays","weekly","monthly","yearly"
“提醒”字段以分钟为单位,表示startdate
提醒应该开始提醒之前的分钟数
我需要选择“正在进行”和提醒的事件(混合两者没有问题......我将在 php 中拆分“真实事件”/“提醒”)
精选
在这个 SELECT 我只会考虑“一次”(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 (开始日期,间隔提醒分钟)**reminder**
前几分钟起作用**startdate**
如您所见,SELECT 在第一个计划之后错过了 kind=1 的提醒,因为重复意味着“在 startdate enddate 之间的每一天”,并且提醒本身应该重复出现。
我知道我需要获取下一个日程安排日期/时间并减去**reminder**
,但直到现在我还没有找到正确的解决方案......(请记住,我的“完整”选择应该有工作日/每周/每月/每年的日程安排,比我需要正确的 sql 部分来合并到其他类型的时间表......但是对于这个特定的问题,我限制为每日提醒,只是为了不难理解我在说什么!:D)
如何解决这个问题?请帮帮我 :(