0

イベントやリマインダーをスケジュールできる 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 )

これを解決するには?お願い助けて :(

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 に答える