【问题标题】:mySQL Repeating Events QuerymySQL 重复事件查询
【发布时间】:2013-01-09 07:39:10
【问题描述】:

有一些解决方案,但我不知道如何为我的表更改它。所以我希望有人可以帮助我。

我有下表

╔═════╦═════════╦════════════╦════════════╦═══════════╗
║ 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 

【问题讨论】:

  • 你想要的输出是什么?
  • 欢迎来到 SO :) user1960507 问题 +1,JW +1。用于请求预期结果:)
  • @JW:我需要帮助来创建查询(或获取最终查询)以获取一天中的所有事件(包括重复事件)(如当天或我指定的任何其他日期)。 ..谢谢

标签: mysql sql events repeat recurring


【解决方案1】:

这是我一直在玩的东西(这里是 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)
    )

【讨论】:

    【解决方案2】:

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

    您可以在函数中传递您的日期,它会查找所选日期是否有事件。 它会给你所有的事件是重复事件或非重复事件。

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

    【讨论】:

      【解决方案3】:

      在程序员同事 Aaron Hanson 的帮助下找到了解决方案。问题在于夏令时。这是一个更新的查询...

      SELECT 
        CONCAT_WS(
          ' ', 
          '2018-07-17', 
          TIME(start_time)
        ) AS ShiftDateTime 
      FROM 
        schedule 
      WHERE 
        IF(
          repeat_type = 'daily', 
          '2018-07-17', 
          IF(
            repeat_type = 'weekly', 
            DAYOFWEEK('2018-07-17') = DAYOFWEEK(start_date), 
            IF(
              repeat_type = 'monthly', 
              DAYOFMONTH('2018-07-17') = DAYOFMONTH(start_date), 
              IF(
                repeat_type = 'quarterly', 
                (
                  (
                    MONTH('2018-07-17') - MONTH(
                      DATE(start_date)
                    )
                  ) % 3 = 0
                ), 
                IF(
                  repeat_type = 'yearly', 
                  DAYOFYEAR('2018-07-17') = DAYOFYEAR(start_date), 
                  IF(
                    repeat_type = NULL, start_date, '0000-00-00 00:00:00'
                  )
                )
              )
            )
          )
        ) 
        AND DATE(start_date) <= '2018-07-17' 
        AND IF(
          repeat_end_date <> '0000-00-00', repeat_end_date >= '2018-07-17', 
          '1'
        ) 
      ORDER BY 
        ShiftDateTime ASC
      

      【讨论】:

        猜你喜欢
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2016-04-24
        • 1970-01-01
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多