mysql - 查找数据库表中是否有可用的时隙

标签 mysql database

我有以下包含列的数据库表。

+----+---------------------+---------------------+------------------+
| 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 |
+----+---------------------+---------------------+------------------+

通过用户输入的日期、开始时间和结束时间,我想知道在给定的时间段内是否有为特定 arena_surface_id 预订的任何插槽。

例如,如果用户输入是。

start_datetime : 2012-11-22 6:00
end_datetime : 2012-11-22 9:00
arena_surface_id : 2

我想知道是否有任何行与给定日期时间的 6:00 到 9:00 之间的时间段匹配(在上面的示例中它应该匹配)。

什么是正确的 mysql 查询?

这实际上是这个 how would I detect a non-overlap of two time periods? 的后续问题

更新

@March 这是我使用您的查询时返回的内容。

SELECT 
    id, 
    start_datetime, 
    end_datetime, 
    arena_surface_id 
FROM 
    gce_arena_surface_booking 
WHERE 
    (start_datetime BETWEEN '2012-11-22 04:00:00' AND '2012-11-22 09:00:00')
OR 
    (end_datetime BETWEEN '2012-11-22 4:00:00' AND '2012-11-22 9:00:00')


+----+---------------------+---------------------+------------------+
| id | start_datetime      | end_datetime        | arena_surface_id |
+----+---------------------+---------------------+------------------+
|  1 | 2012-11-22 02:30:00 | 2012-11-22 05:00: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 |
+----+---------------------+---------------------+------------------+

中间记录不符合条件,仍取。

最佳答案

怎么样

SELECT * 
FROM yourTable
WHERE (startTime BETWEEN 'yourStartImput' AND 'yourEndImput') OR (endTime BETWEEN 'yourStartImput' AND 'yourEndImput')

因此,您检查输入之间是否有开始或结束的匹配项。

对于您的评论,您的最终查询应如下所示:

SELECT * 
FROM yourTable
WHERE ((startTime BETWEEN 'yourStartImput' AND 'yourEndImput') 
  OR (endTime BETWEEN 'yourStartImput' AND 'yourEndImput')) 
  AND arena_surface_id = 1

关于mysql - 查找数据库表中是否有可用的时隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13513516/

相关文章:

MySQL 默认顺序取决于 WHERE

php - 使用 NULL 值变量从 PHP 将 NULL 值插入 MySQL

database - Mule ESB数据流设计

java - Servlet 处理 Http Post 请求并将数据发送到数据库表

javascript - 何时使用 Knex transacting() 与链接 trx 对象

INSERT FROM SELECT 之后使用 keycache 修复 MySQL

mysql - 在 WHERE IN 条件之外返回的行

mysql - 启动应用程序一段时间后 uwsgi 出现两个 MySql 错误

mysql - 您可以将自己的数据库用于 Facebook 应用程序吗?

mysql - 值的列类型可以是 NULL 或完整日期时间?