选择在给定月份内发生的事件

时间:2014-04-17 09:25:37

标签: php mysql

我正在尝试从我的数据库中选择在给定月份内发生的事件。 我似乎无法弄清楚如何选择那些在给定月份之前开始并在之后结束的事件。

我知道我应该得到两个日期之间的日期范围,看看给定的月份是否在这个范围内。我还想创建一个列范围,它根据事件的范围有三个值。当事件在给定月份内开始和结束时,此值将为“适合”。当事件在给定月份开始,但延伸超过它时,值为'extends'。当它在给定月份之前开始,但在它结束时,它就是“过去”。最后,当它开始并进一步发展时,价值就是“满员”

我不知道的是如何实现这一点。这一切都可以用MySQL完成,还是第二部分需要用PHP实现?

以下是表结构的示例:

| Event_id | Date_from           | Date_to             |
+----------+----------------------+--------------------+
|    1     | 2014-03-05 19:28:00 | 2014-03-06 09:00:00 |
|    2     | 2014-02-05 00:00:00 | 2014-03-07 10:00:00 |
|    3     | 2014-03-28 15:00:00 | 2014-05-06 00:00:00 |
|    4     | 2014-02-05 00:00:00 | 2014-05-06 00:00:00 |
|    5     | 2014-05-06 19:28:00 | 2014-06-03 19:28:00 |

我试图实现的select语句的结果应如下所示:

| Event_id | Date_from           | Date_to             | Range     |
+----------+----------------------+----------------------+---------+
|    1     | 2014-03-05 19:28:00 | 2014-03-06 09:00:00 | 'fits'    |
|    2     | 2014-02-05 00:00:00 | 2014-03-07 10:00:00 | 'past'    |
|    3     | 2014-03-28 15:00:00 | 2014-05-06 00:00:00 | 'extends' |
|    4     | 2014-02-05 00:00:00 | 2014-05-06 00:00:00 | 'full'    |

我现在完全无能为力,因此我将非常感谢有关如何做到这一点的任何建议和提示。非常感谢您阅读本文并为您提供帮助。

PS: 在我意识到我需要考虑符合“完整”范围标准的事件之前,我有这个:

SELECT * FROM `eventstesting` 
WHERE   `e_to` < '2014-04-01' OR
        `e_from` > '2014-03-01' 

成功选择符合“过去”,“适合”和“扩展”条件的事件,但仍未生成range列。

我还检查了这个主题MySQL - Get a list of months on which events are taking place,但它没有帮助我

2 个答案:

答案 0 :(得分:1)

SELECT *
     , CASE WHEN date_from >= '2014-03-01' AND date_to < '2014-04-01' THEN 'fits' 
            WHEN date_from < '2014-03-01' AND date_to BETWEEN '2014-03-01' AND '2014-04-01' THEN 'past' 
            WHEN date_from BETWEEN '2014-03-01' AND '2014-04-01' AND date_to >= '2014-04-01' THEN 'extends' 
            WHEN date_from <= '2014-03-01' AND date_to >= '2014-04-01' THEN 'full' 
        END `range` 
  FROM eventstesting
 HAVING `range` IS NOT NULL;

答案 1 :(得分:0)

日期范围选择技巧 - 我认为这正是您所需要的:

start < month_end_date
and
end > month_start_date

基本上,您选择在月份结束之前开始并在月份开始之后结束的任何事件 - 即它与月份部分或完全重叠。

我不确定这是否正是您所需要的,但这就是您通常如何有效地比较日期范围。

啊,还有一件事:如果日期可以'打开'(即事件仍然可以继续,结束日期仍为NULL,则需要单独处理)