Mysql 选择给定开始日期时间和结束日期时间的所有行

Mysql 选择给定开始日期时间和结束日期时间的所有行,mysql,database,Mysql,Database,我有一个mysql表,其中包含以下记录 表名:gce\u竞技场\u地面\u预订 +----+---------------------+---------------------+------------------+ | id | start_datetime | end_datetime | arena_surface_id | +----+---------------------+---------------------+------------------+

我有一个mysql表,其中包含以下记录

表名:
gce\u竞技场\u地面\u预订

+----+---------------------+---------------------+------------------+
| 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\u datetime
end\u 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'

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

用什么样的mysql查询来处理我的问题


这里是指向是否要使用记录和模式的链接。

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

   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)
因此,您需要找到的预订既在新预订结束之前开始,也在新预订开始之后结束

你的问题应该是

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
选择id、start\u datetime、end\u datetime、arena\u surface\u id
来自gce\U竞技场\U地面\U预订
其中('2012-11-23 6:00'>开始日期时间)
和('2012-11-23 2:00'
新预订结束时或之后开始的预订,或新预订开始时或之前结束的预订都没有问题

因此,您需要找到的预订既在新预订结束之前开始,也在新预订开始之后结束

你的问题应该是

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
选择id、start\u datetime、end\u datetime、arena\u surface\u id
来自gce\U竞技场\U地面\U预订
其中('2012-11-23 6:00'>开始日期时间)
和('2012-11-23 2:00'
查找重叠预订的查询如下所示。只需再添加一次检查,以确定我们正在搜索的插槽是否位于数据库中已预订的插槽中。 这就像搜索槽的开始日期和结束日期都在已预订的槽中一样

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)

查找重叠预订的查询如下所示。只需再添加一次检查,以确定我们正在搜索的插槽是否位于数据库中已预订的插槽中。 这就像搜索槽的开始日期和结束日期都在已预订的槽中一样

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)

这是行不通的:(,@anand你可以看看这个链接,看看它是否返回正确的记录。什么是结束时间,竞技场表面id条件在哪里?如果我尝试将值设为
'2012-11-22 1:30'
'2012-11-22 4:00'
它返回的是空记录,而它应该返回两条记录,wh至少可能是错误的?这不起作用:(,@anand你可以看看这个链接,看看它是否返回正确的记录。什么是结束时间,竞技场表面id条件在哪里?如果我尝试将值设为
'2012-11-22 1:30'
'2012-11-22 4:00'
它返回的是空记录,而它应该返回两条记录,wh至少可能是错的?