1

我正在用 jquery mobile 构建一个移动 webapp。现在让我先画出我正在做的事情。

用户想要预订会议室。首先,他选择了一个房间,并且只选择了他想要保留的那个房间,没有其他房间。然后他还输入了开始和结束日期时间。这是他想要拥有这个房间的时期。

现在,我的网络服务中有一个功能,它会返回一个列表,其中包含在该特定会议室进行的所有预订。稍后,如果此列表为空,我将检查我的 javascript。

现在我的数据库结构。

我有以下设计的餐桌预订

 ID           --> int
  ROOMID       --> int
  DATE_BEGIN   --> DATETIME
  DATE_END     --> DATETIME

我还有一个具有以下设计的桌子房间

   ID            --> int
   NAME          --> VARCHAR(30)

现在在表保留中插入一行看起来像这样

     ID            --> 1
     ROOMID        --> 2
     DATE_BEGIN    --> 2012-01-01 12:02:33
     DATE_END      --> 2012-01-01 14:00:00

现在我有这个查询

SELECT res.DATE_BEGIN,res.DATE_END 
FROM reservations res
INNER JOIN room roo
ON res.ROOMID =roo.ID
WHERE WHERE res.DATE_BEGIN <> @DATE_BEGIN
AND res_DATE_END <> @DATE_END

现在我的问题是应该进行什么查询才能获得正确的结果。过去的保留也应该被过滤掉。

有人可以帮忙吗?

谢谢

4

2 回答 2

4

您需要检查一个日期范围是否与另一个日期范围重叠。

New Date Range =               |-----------|
Test1          =      |=====|
Test2          =            |=====|
Test3          =                  |=====|
Test4          =                        |=====|
Test5          =                              |=====|
Test6          =            |=================|

只有 Test1 和 Test5 不重叠。

因此,可以通过...找到碰撞

SELECT
  res.DATE_BEGIN, res.DATE_END
FROM
  reservations res
INNER JOIN
  room roo
    ON res.ROOMID =roo.ID
WHERE
      res.DATE_BEGIN < @DATE_END
  AND res_DATE_END   > @DATE_BEGIN


笔记:

注意边界条件。如果一个会议在上午 10 点结束,而另一个会议在上午 10 点开始,这通常不会被视为重叠。这就是我使用<and的原因>


编辑

由于超出本问答范围的原因,我上面强调的此类查询不容易使用索引进行优化。

出于这个原因,另一种方法是创建可以预订房间的时间段。没有人需要在中午过去 2 分 33 秒开始会议。相反,他们会在 12:00 开始。因为这样的 5 分钟块通常足够准确,实际上系统经常使用 15 分钟块甚至 30 分钟块。

这意味着一个预订可能需要多条记录(每个预订时间块 1 条记录),但是对该数据的每个查询都变得更容易解决。

于 2012-05-25T09:03:19.867 回答
0

接受的答案处理重叠会议,但不会与现有会议同时处理会议。我将查询用于已接受的解决方案,并为相同的开始和结束日期添加了第二次检查。为了便于阅读,我将查询分开。

我使用了上面的解决方案并添加了第二个检查:

-- 新会议是否与现有会议同时开始或结束
SELECT res.DATE_BEGIN, res.DATE_END
FROM reservations res
WHERE res.DATE_BEGIN = @DATE_BEGIN OR
res.DATE_END = @DATE_END;

结果表明存在冲突。

于 2013-12-03T15:14:14.760 回答