作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个 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_datetime
和 end_datetime
是否存在任何预订>/p>
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
,如果我这样做,它不会返回任何结果,而引用上面记录我希望它返回一个 ID 为 7
的行,因为我在 2:00
和 18:00
之间预订了时间段,因此任何与 02:00
和 18:00
之间的时间匹配的给定值都应该返回一行。
什么是正确的 mysql 查询来处理我的问题?
这里是 sqlfiddle 的链接如果您想尝试使用记录和模式。
最佳答案
查找重叠预订的查询如下。只需要再添加一项检查以查找我们正在搜索的插槽是否在数据库中已预订的插槽中。好像搜索时段的开始日期和结束日期都在已经预订的时段中。
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)
关于mysql - 选择给定 start_datetime 和 end_datetime 的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13527230/
我有这个 mysql 表,其中包含以下记录。 表名:gce_arena_surface_booking +----+---------------------+--------------------
我是一名优秀的程序员,十分优秀!