我正在使用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
现在我的问题是获得正确结果应该是什么样的查询。此外,过去的预订也会被过滤掉。
有人可以帮忙吗?
谢谢
答案 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;
结果表明存在冲突。