0

我正在开发一个可以安排事件和提醒的 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)

如何解决这个问题?请帮帮我 :(

4

1 回答 1

0
-- I suggest you to modify the table. Here is updated table structure

-- 
-- Table structure for table `reminder`
-- 

CREATE TABLE `reminder` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(255) NOT NULL,
  `startdate` datetime NOT NULL,
  `enddate` date NOT NULL,
  `kind` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- 
-- Dumping data for table `reminder`
-- 

INSERT INTO `reminder` (`id`, `title`, `startdate`, `enddate`, `kind`) VALUES 
(1, 'This is reminder', '2015-06-03 19:25:44', '2015-07-21', 'weekly'); 


-- Query data get results for 2015-06-17 from  `reminder` table
SELECT CONCAT_WS(' ','2015-06-17',TIME(startdate)) AS ReminderDateTime, title
                  FROM reminder  
                  WHERE IF(
                                        kind='daily',
                                        ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (1*24*60*60)=0)  ,
                                        IF(
                                            kind='weekly',
                                            ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (7*24*60*60)=0)  ,
                                            IF(
                                                kind='monthly',
                                                DAYOFMONTH('2015-06-17')=DAYOFMONTH(startdate),                         
                                                IF(
                                                    kind='quarterly',
                                                    ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (91*24*60*60)=0) ,
                                                    IF(
                                                        kind='yearly',
                                                        DAYOFYEAR('2015-06-17')=DAYOFYEAR(startdate),   
                                                        IF(
                                                            kind='',
                                                            startdate,
                                                            '0000-00-00 00:00:00'
                                                        )
                                                    )   
                                                )   
                                            )   
                                         )
                                        ) AND DATE(startdate) <='2015-06-17' AND IF(enddate<>'0000-00-00',enddate>='2015-06-17','1') ORDER BY ReminderDateTime ASC
于 2015-07-05T14:38:01.027 回答