检查给定的开始日期和结束日期之间是否有空房

时间:2012-05-25 08:54:45

标签: javascript sql web-services

我正在使用jquery mobile构建移动webapp。现在让我先描绘一下我正在做的事情。

用户想要预订会议室。首先,他选择了一个房间,只有他想要保留的房间,没有其他房间。比他还进入开始和结束DATETIME。这是他想要这个房间的时期。

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

现在是我的数据库结构。

我有以下设计的表格预订

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

我还有一个表ROOM,其设计如下

   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

现在我的问题是获得正确结果应该是什么样的查询。此外,过去的预订也会被过滤掉。

有人可以帮忙吗?

谢谢

2 个答案:

答案 0 :(得分: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点开始,通常不会被视为重叠。这就是我使用<>的原因。


修改

由于这个问题和答案范围之外的原因,我在上面突出显示的查询不容易使用索引进行优化。

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

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

答案 1 :(得分:0)

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

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

- 新会议是否与现有会议同时开始或结束 选择res.DATE_BEGIN,res.DATE_END
来自预订res res whereDATE_BEGIN = @DATE_BEGIN或
      res.DATE_END = @DATE_END;

结果表明存在冲突。