2013-01-09 152 views
2

有一些解决方案,但我不知道如何改变我的表。所以我希望有人能帮助我。mySQL重复事件查询

我有以下表

╔═════╦═════════╦════════════╦════════════╦═══════════╗ 
║ UID ║ TITLE ║ BEGIN ║ END  ║ RECURRING ║ 
╠═════╬═════════╬════════════╬════════════╬═══════════╣ 
║ 1 ║ event A ║ 1359741600 ║ 1359745200 ║ none  ║ 
║ 1 ║ event B ║ 1359741600 ║   0 ║ daily  ║ 
║ 1 ║ event C ║ 1359741600 ║   0 ║ weekly ║ 
║ 1 ║ event D ║ 1359741600 ║   0 ║ monthly ║ 
║ 1 ║ event E ║ 1359741600 ║   0 ║ yearly ║ 
╚═════╩═════════╩════════════╩════════════╩═══════════╝ 

如何我现在可以从现在开始选择每一个事件多达7天,也是在未来7天所有的重复事件?

以下我已经尝试过,但不是很好,没有完成。

SELECT 
    * 
FROM 
    `tx_events_domain_model_event` 
WHERE 
    /* none recurring events in the next 7 days */ 
    (
    recuring = 'none' 
    AND (begin_date + begin_time) >= UNIX_TIMESTAMP(NOW()) 
    AND (end_date + end_time) <= UNIX_TIMESTAMP(DATE_ADD(NOW(), INTERVAL 7 DAY)) 
) 
    OR 
    /* Daily */ 
    recuring = 'daily' 
    OR 
    /* Weekly */ 
    (
    recuring = 'weekly' 
    AND DAYOFWEEK(NOW()) - 1 <= DAYOFWEEK(FROM_UNIXTIME(begin_date)) - 1 
) 
    OR 
    /* Monthly */ 
    (recuring = 'monthly' 
    AND 
+2

什么是您想要的输出? –

+0

欢迎来到SO :) user1960507 +1和JW的问题。用于请求预期的结果:) – bonCodigo

+0

@JW:我需要帮助来创建查询(或获取最终查询)来获取一天中的所有事件(包括重复事件)(如当前日期或我指定的任何其他日期).. 。 谢谢 – HR123

回答

2

这里的东西我一直在玩(在这里是作为一个sqlfiddle一些样本数据)...不是100%肯定,但它应该抓住过去7天的数据。请注意,我使用MySQL DATETIME与整数时间戳,但您应该能够轻松地进行转换(用于测试查询,使用字符串日期更容易)。

SELECT * 
    FROM 
    (SELECT 
     *, 
     CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-', DAY(start)) AS monthly, 
     CONCAT(YEAR(NOW()), '-', MONTH(start), '-', DAY(start)) AS yearly 
     FROM events 
    ) tmp 
    WHERE 
    (
     (recurring = 'none') 
     OR (recurring = 'daily') 
     OR (recurring = 'weekly') 
     OR (
     recurring = 'monthly' 
     AND (
      (
      monthly >= NOW() 
      AND monthly <= DATE_ADD(NOW(), INTERVAL 7 DAY) 
     ) 
      OR (
      DATE_ADD(monthly, INTERVAL 1 MONTH) >= NOW() 
      AND DATE_ADD(monthly, INTERVAL 1 MONTH) <= DATE_ADD(NOW(), INTERVAL 7 DAY) 
     ) 
     ) 
    ) 
     OR (
     recurring = 'yearly' 
     AND (
      (
      yearly >= NOW() 
      AND yearly <= DATE_ADD(NOW(), INTERVAL 7 DAY) 
     ) 
      OR (
      DATE_ADD(yearly, INTERVAL 1 YEAR) >= NOW() 
      AND DATE_ADD(yearly, INTERVAL 1 YEAR) <= DATE_ADD(NOW(), INTERVAL 7 DAY) 
     ) 
     ) 
    ) 
    ) 
    AND start <= NOW() 
    AND (
     end IS NULL 
     OR end >= DATE_ADD(NOW(), INTERVAL 7 DAY) 
    ) 
0

这是我用于提醒表的代码。

你可以在函数中传递你的日期,它会发现选择的日期是否有事件。 它会给你的所有事件是经常性事件或非经常性事件。

-- 
-- 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