【问题标题】:find if time slots are available in database table查找数据库表中是否有可用的时隙
【发布时间】:2012-11-22 13:14:37
【问题描述】:

我有以下带有列的数据库表。

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

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

【问题讨论】:

标签: mysql database


【解决方案1】:

怎么样

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

【讨论】:

  • 我尝试使用这种方式,但它给了我语法错误。 SELECT * FROM gce_arena_surface_booking WHERE (start_datetime BETWEEN 2012-11-22 4:00 AND 2012-11-22 9:00) OR (end_datetime BETWEEN 2012-11-22 4:00 AND 2012-11-22 9:00);
  • 您需要在日期前后加上单引号
  • 是的,它现在提取,但在这之间有一个错误的记录被提取。生病将我的问题更新为它返回的内容,您可以查看该问题。
  • @IbrahimAzharArmar 你能解释一下为什么中间记录是错误的吗?
  • 我错了它是完美的,但是我需要添加另一个条件,说明 WHERE arena_surface_id = 1 只是将其附加到最后一个不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多