我使用两个表tblMeet(roomid,meetid,timein,timeout,roomname,user,date)和tblMeetRoom(roomid,roomname,pc,phone,projector,capacity,location),其中roomid,roomname是tblMeet中的外键。
我需要的是:从tblMeet中选择所有这样的空间,在这些空间中,date=sysdate和time和time不与传递的参数重叠,并且具有用户提供的参数(pc、电话、投影机)中指定的资源,然后我需要来自tblMeetRoom的其余未分配的房间(如果存在这样的房间)。任何分配的空间都会填充tblMeet,而当创建房间信息时,它会填充tblMeetingRoom。
为此目的,我创建了这个存储过程:参数:顺铂、帕尔安普、顺式电话、顺式放映机。
select roomname
from tblmeet
where
(date=paramdate
and (paramtimein not between (timein and timeout))
and paramtimeout not between(timein and timeout)))
except
select roomname
from tblmeet
where (date=paramdate
and (paramtimein between (timein and timeout))
and paramtimeout between(timein and timeout))
union
select roomname
from tblmeetroom
where(phone=paramphone
and pc=parampc
and projector=paramprojector)
except
select roomname
from tblmeetroom
where(date=paramdate
and (paramtimein not between (timein and timeout))
and paramtimeout not between(timein and timeout))) 然而,我得到的结果是,不是用重叠的时隙来划出分配的房间,而是重选那些参数和参数之间严格介于时隙和超时值之间的房间。也就是说,如果有一个分配给11:30到12:45的房间,那么就会显示如果参数是11:45到12:30,那么就会显示出,但是如果参数是11:45到12:50,那么这仍然显示了这个房间可用的.
请帮助处理任何可能出现的逻辑错误。谢谢。
发布于 2014-04-18 17:37:14
如果不花时间完全理解这个问题,我怀疑您对重叠时间范围的测试是有缺陷的。您正在检查任何冲突,其中您的开始和停止时间都在开始和停止时间,您正在检查。如果它们都在该范围内,则只会发现测试范围完全在现有范围内的冲突。如果需要任何重叠,只需要求测试范围在现有范围结束之前开始,测试范围在现有范围启动后结束。很难解释,但代码实际上比概念之间的代码要短。请参阅此示例,它没有解决整个问题集,而是只关注在给定的时间范围内找到可用的空间。
DECLARE @tblmeet TABLE (roomname varchar(50), timein datetime, timeout datetime);
DECLARE @paramtimein datetime, @paramtimeout datetime;
INSERT INTO @tblmeet (roomname, timein, timeout) values ('A', '2014-04-18 9:00 AM','2014-04-18 9:14 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('A', '2014-04-18 9:15 AM','2014-04-18 9:45 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('B', '2014-04-18 9:00 AM','2014-04-18 9:29 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('B', '2014-04-18 9:30 AM','2014-04-18 10:29 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('B', '2014-04-18 10:30 AM','2014-04-18 11:29 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('C', '2014-04-18 10:00 AM','2014-04-18 10:29 AM');
INSERT INTO @tblmeet (roomname, timein, timeout) values ('C', '2014-04-18 11:00 AM','2014-04-18 11:29 AM');
-- test input:
SELECT
@paramtimein = '2014-04-18 9:15 AM',
@paramtimeout = '2014-04-18 9:45 AM';
-- conflicts:
SELECT
*
FROM @tblmeet
WHERE (
@paramtimein <= timeout
AND
@paramtimeout >= timein
);
-- available rooms:
SELECT
roomname
FROM @tblmeet
EXCEPT
SELECT
roomname
FROM @tblmeet
WHERE (
@paramtimein <= timeout
AND
@paramtimeout >= timein
);请注意,我还没有很好地考虑过边缘情况。例如,当已经有上午10:30到11:00的会议时,系统应该允许上午11:00到11:30的会议吗?从技术上讲,上午11点的时间是重叠的,但人类一般不认为这是重叠。
另外,我要指出的是,你似乎需要一个房间有一些现有的预订,以便为未来的预订考虑。看起来你应该在某个地方有一个房间名称的列表。也许我只是没有完全理解你的设计提供的信息。
https://stackoverflow.com/questions/23157753
复制相似问题