Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
联接表中的Sql查询问题_Sql_Sql Server_Join - Fatal编程技术网

联接表中的Sql查询问题

联接表中的Sql查询问题,sql,sql-server,join,Sql,Sql Server,Join,我正在使用两个表TBLMetroomid、meetid、timein、timeout、roomname、user、date和TBLMetroomRoomId、roomname、pc、电话、投影仪、容量、roomid、roomname是TBLMet外键的位置 我需要的是: 从TBLMET中选择所有此类房间ID,其中date=sysdate,time in和time out不与传递的参数重叠,并且具有userpc、电话、投影仪提供的参数中指定的资源,那么我需要TBLMETROOM中剩余的未分配房间,

我正在使用两个表TBLMetroomid、meetid、timein、timeout、roomname、user、date和TBLMetroomRoomId、roomname、pc、电话、投影仪、容量、roomid、roomname是TBLMet外键的位置

我需要的是: 从TBLMET中选择所有此类房间ID,其中date=sysdate,time in和time out不与传递的参数重叠,并且具有userpc、电话、投影仪提供的参数中指定的资源,那么我需要TBLMETROOM中剩余的未分配房间,前提是此类房间存在。任何分配的房间都将填充TBLMet,而创建房间信息时,它将填充TBLMeetGroom

我为此创建了此存储过程: 参数:paramdate、paramtimein、paramtimeout、paramdate、parampc、paramphone、paramprojector

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)))    
然而,我得到的结果是,它没有划掉具有重叠时间段的分配房间,而是重新排列paramtimein和paramtimeout严格位于timein和timeout的列值之间的房间。也就是说,如果有一个房间被分配为11:30到12:45,则如果paramtimein和paramtimeout类似于11:45到12:30,则显示已预订,但如果paramtimein和paramtimeout类似于11:45到12:50,则仍显示此房间可用


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

在没有花时间完全理解问题的情况下,我怀疑您的重叠时间范围测试有缺陷。您正在检查开始和停止时间都在您正在检查的开始和停止时间内的任何冲突。如果它们都在该范围内,那么您只会发现测试范围完全在现有范围内的冲突。如果需要任何重叠,只需要求测试范围在现有范围结束之前开始,测试范围在现有范围开始之后结束。这很难解释,但代码实际上比概念之间的代码要短。请看这个例子,它并没有解决您的整个问题集,只关注在给定的时间范围内找到一个可用的房间

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:00的时间是重叠的,但是人类一般不认为这是重叠的。
另外,我要指出的是,您似乎要求一个房间有一些现有的预订,以便考虑将来的预订。看起来你应该在某个地方有一个房间名称的列表。根据提供的信息,也许我还没有完全理解您的设计。

您使用的是哪种数据库?如果您是指SQL server,请使用Microsoft SQL server 2010。没有SQL server 2010。有SQLServer2008、2008R2,然后是2012年,最近是2014年。我相信您指的是Visual Studio 2010。那么就是它了。。实际上我不确定。。它可能是SQL server 2012..好的。请编辑您的问题,在表格中添加一些数据。这将帮助您获得更快的响应。您也可以创建一个类似的。实际上,我正在做的是选择从TBLMet分配的房间,然后减去那些不符合用户资源筛选要求的房间,然后从TBLMetoom中所有可用房间的列表中,我只选择没有在TBLMet中的房间并应用筛选条件,然后通过并集获取两个表的结果。资源过滤器在PC、电话、projectorOk上运行,但您仍然有相同的重叠时间范围,对吗?我提供的代码地址是。是的。事实上,我的第一个方法是,由于有这么多的条件检查,我尝试在运算符之间而不是运算符之间进行缩减。现在我的问题得到了解决,并且完全按照需要工作。