【问题标题】:check if a room available between a given begin and end dateTime检查在给定的开始日期和结束日期时间之间是否有可用房间
【发布时间】:2012-05-31 20:33:20
【问题描述】:

我正在使用 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

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

有人可以帮忙吗?

谢谢

【问题讨论】:

  • 请说明您需要的结果。您需要从 BEGIN_DATE 开始到 END_DATE 结束的所有预订,还是从 BEGIN_DATE 开始但可能在任何日期结束的预订

标签: javascript sql web-services


【解决方案1】:

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

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

-- 新会议是否与现有会议同时开始或结束
选择 res.DATE_BEGIN,res.DATE_END
FROM 预订资源
WHERE res.DATE_BEGIN = @DATE_BEGIN OR
res.DATE_END = @DATE_END;

结果表明存在冲突。

【讨论】:

    【解决方案2】:

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

    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 点开始,这通常不会被视为重叠。这就是我使用&lt;&gt; 的原因。


    编辑

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 2018-07-26
      相关资源
      最近更新 更多