为给定的start_datetime和end_datetime选择所有行

时间:2012-11-23 10:31:49

标签: mysql database

我有这个包含以下记录的mysql表。

表名:gce_arena_surface_booking

+----+---------------------+---------------------+------------------+
| id | start_datetime      | end_datetime        | arena_surface_id |
+----+---------------------+---------------------+------------------+
|  1 | 2012-11-22 02:30:00 | 2012-11-22 05:00:00 |                2 |
|  2 | 2012-11-22 00:00:00 | 2012-11-22 02:30:00 |                2 |
|  3 | 2012-11-22 05:00:00 | 2012-11-22 08:00:00 |                2 |
|  4 | 2012-11-22 08:00:00 | 2012-11-22 11:00:00 |                2 |
|  5 | 2012-11-22 11:00:00 | 2012-11-22 17:00:00 |                2 |
|  6 | 2012-11-22 17:30:00 | 2012-11-22 22:00:00 |                2 |
|  7 | 2012-11-23 02:00:00 | 2012-11-23 18:00:00 |                2 |
+----+---------------------+---------------------+------------------+

我需要知道在给定的日期时间,如果已经存在任何预订,我正在使用此查询检查是否存在给定start_datetimeend_datetime

的任何预订
SELECT 
    id, start_datetime, end_datetime, arena_surface_id 
FROM 
    gce_arena_surface_booking 
WHERE (
    (start_datetime BETWEEN '2012-11-23 2:00' AND '2012-11-23 6:00') OR 
    (end_datetime BETWEEN '2012-11-23 2:00' AND '2012-11-23 6:00')
) 
AND arena_surface_id = 2

上面的查询给我带来了问题,例如我的值是否改变了:

'2012-11-23 2:00' AND '2012-11-23 6:00'

'2012-11-23 2:30' AND '2012-11-23 6:00'

请注意,我已将值从2:00更改为2:30,如果我这样做,它不会返回任何结果,而参考上述记录我希望它返回给我一行标识为7,因为我在2:0018:00之间预订了时间段,因此任何与02:0018:00之间的时间匹配的给定值都应为返回一行。

什么是适当的mysql查询来处理我的问题?

如果你想玩记录和架构,这里是sqlfiddle的链接。

3 个答案:

答案 0 :(得分:3)

下面给出了查找重叠预订的查询。只需添加一个检查来查找我们正在搜索的插槽是否在数据库中已预订的插槽中。 它就像搜索位置的开始日期和结束日期一样,已经预订了插槽。

SELECT 
    id, start_datetime, end_datetime, arena_surface_id 
FROM 
    gce_arena_surface_booking 
WHERE (
    (start_datetime BETWEEN '2012-11-23 2:30' AND '2012-11-23 6:00') OR 
    (end_datetime BETWEEN '2012-11-23 2:30' AND '2012-11-23 6:00')

  OR '2012-11-23 2:30' BETWEEN start_datetime AND end_datetime


) 
AND arena_surface_id = 2

如果需要在数据库中找到非重叠广告位,请使用以下查询。这是对上述内容的否定。

SELECT * FROM `gce_arena_surface_booking`
WHERE (`arena_surface_id`=2)
AND
(start_datetime NOT BETWEEN '2012-11-23 02:30:00' AND '2012-11-23 06:00:00')
AND
(end_datetime NOT BETWEEN '2012-11-23 02:30:00' AND '2012-11-23 06:00:00')
AND
('2012-11-23 02:30:00' NOT BETWEEN start_datetime AND end_datetime)

答案 1 :(得分:1)

   SELECT 
        id, start_datetime, end_datetime, arena_surface_id 
    FROM 
        gce_arena_surface_booking 

    Where ('2012-11-23 2:30' between start_datetime and end_datetime)
    and ('2012-11-23 6:00' between start_datetime and end_datetime)

答案 2 :(得分:1)

在您的新预订结束时或之后开始的预订,或在您的新预订开始时或之前结束的预订都没有问题。

因此,您需要查找的预订​​是在新预订结束之前开始的预订,并在您的新预订开始之后结束。

您的查询应该是

SELECT id, start_datetime, end_datetime, arena_surface_id 
FROM gce_arena_surface_booking 
WHERE ('2012-11-23 6:00' > start_datetime)
AND ('2012-11-23 2:00' < end_datetime)
AND arena_surface_id = 2