从数据库中获取跨越多天的事件

时间:2013-09-05 11:57:47

标签: php mysql sql

我正在尝试将存储在数据库表中的日历的所有事件都放在用户给出的特定范围内。它一直有效,直到事件跨越多天。此时,结束日期将不在时间范围内,因此查询将丢弃它。我的问题是如何获得属于给定范围内的所有事件,无论它们是否在范围之前开始并在其内部结束,或者它们是否在范围内开始并在之后结束。我必须从结果中排除在范围之后开始或在范围之前结束的所有事件

CREATE TABLE IF NOT EXISTS `events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

当前查询

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
  FROM events t0_ 
  WHERE t0_.start > start
    AND t0_.end < end

示例数据:

name                     start                    end
--------------------     --------------------     --------------------
test event               2012-02-17 09:00:00      2012-02-17 09:50:00
test event2              2012-02-17 09:00:00      2012-02-19 09:00:00
test event3              2012-02-12 09:00:00      2012-02-17 09:00:00
test event4              2012-02-12 09:00:00      2012-02-13 09:00:00

预期结果数据:

name                     start                    end
--------------------     --------------------     --------------------
test event               2012-02-17 09:00:00      2012-02-17 09:50:00
test event2              2012-02-17 09:00:00      2012-02-19 09:00:00
test event3              2012-02-12 09:00:00      2012-02-17 09:00:00

有范围:

2012-02-17 00:00:00 - 2012-02-17 23:59:59

你可以看到我接受了给定范围内的事件,以及在范围内开始并在之后结束的事件以及在范围之前开始但在其中结束的事件。

1 个答案:

答案 0 :(得分:1)

最简单的方法是通过否定来实现:

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
FROM events t0_ 
WHERE 
    NOT(
        t0_.end < '2013-09-05 00:00:00'
        OR t0_.start > '2013-09-06 23:59:59'
    )

这样就可以过滤掉在范围之前结束并在范围之后开始的所有事件。