【发布时间】:2013-03-31 12:56:11
【问题描述】:
我正在开发一个可以安排事件和提醒的 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
)
)
问题
选择“一次性”类型的事件和提醒没有问题,因为提醒在**startdate** 之前的**reminder** 分钟通过DATE_SUB(开始日期,间隔提醒分钟)
如您所见,SELECT 在第一个计划之后错过了 kind=1 的提醒,因为重复意味着“从 startdate 到 enddate 之间的每一天”,并且提醒本身应该重复出现。
我知道我需要获取下一个计划日期/时间并减去 **reminder**,但直到现在我还没有找到正确的解决方案......(请记住,我的“完整”选择应该有工作日/每周/每月/yearly 类型的时间表,而不是我需要正确的 sql 部分来合并到其他类型的时间表......但是对于这个特定的问题,我限制为每日提醒,只是为了不难理解我在说什么!:D )
如何解决这个问题?请帮帮我:(
【问题讨论】:
-
除非这是家庭作业,否则为用户选择可能应用的所有行会更容易,然后在数据库之外进行日期时间数学以确定哪些行与当前时间相关跨度>
-
这不是 mysql 高效的解决方案......我知道(而且我已经做到了!)你在说什么,但我想在没有任何 php“技巧”的情况下将事件和提醒作为行来获取...