首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接表中的Sql查询问题

连接表中的Sql查询问题
EN

Stack Overflow用户
提问于 2014-04-18 16:01:05
回答 1查看 78关注 0票数 0

我使用两个表tblMeet(roomid,meetid,timein,timeout,roomname,user,date)tblMeetRoom(roomid,roomname,pc,phone,projector,capacity,location),其中roomid,roomnametblMeet中的外键。

我需要的是:从tblMeet中选择所有这样的空间,在这些空间中,date=sysdate和time和time不与传递的参数重叠,并且具有用户提供的参数(pc、电话、投影机)中指定的资源,然后我需要来自tblMeetRoom的其余未分配的房间(如果存在这样的房间)。任何分配的空间都会填充tblMeet,而当创建房间信息时,它会填充tblMeetingRoom。

为此目的,我创建了这个存储过程:参数:顺铂、帕尔安普、顺式电话、顺式放映机。

代码语言:javascript
复制
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,那么这仍然显示了这个房间可用的.

请帮助处理任何可能出现的逻辑错误。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-18 17:37:14

如果不花时间完全理解这个问题,我怀疑您对重叠时间范围的测试是有缺陷的。您正在检查任何冲突,其中您的开始和停止时间都在开始和停止时间,您正在检查。如果它们都在该范围内,则只会发现测试范围完全在现有范围内的冲突。如果需要任何重叠,只需要求测试范围在现有范围结束之前开始,测试范围在现有范围启动后结束。很难解释,但代码实际上比概念之间的代码要短。请参阅此示例,它没有解决整个问题集,而是只关注在给定的时间范围内找到可用的空间。

代码语言:javascript
复制
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点的时间是重叠的,但人类一般不认为这是重叠。

另外,我要指出的是,你似乎需要一个房间有一些现有的预订,以便为未来的预订考虑。看起来你应该在某个地方有一个房间名称的列表。也许我只是没有完全理解你的设计提供的信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23157753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档