Sql server SQL查询

Sql server SQL查询,sql-server,database,tsql,Sql Server,Database,Tsql,我正在创建一个预订系统,并试图编写一个查询,显示在给定时间哪些资源是免费的,允许用户选择要预订的站点 我的数据库中有两个表 第一桌 第二桌 我正在执行的查询是 SELECT r.wsid,r.location FROM test_revision2 r WHERE r.location='Downsview' AND not exists(select 1 from test_bookings2 b WHERE r.wsid = b.wsid AND r.location = b.locatio

我正在创建一个预订系统,并试图编写一个查询,显示在给定时间哪些资源是免费的,允许用户选择要预订的站点

我的数据库中有两个表

第一桌

第二桌

我正在执行的查询是

SELECT r.wsid,r.location FROM test_revision2 r WHERE r.location='Downsview' AND not exists(select 1 from test_bookings2 b WHERE r.wsid = b.wsid AND r.location = b.location AND b.startDate > '9/5/2017'AND b.endDate <'9/5/2017')

首先,您的表是否重复数据?你需要第一张桌子吗

其次,从只使用第二个表开始,测试\u bookings2

SELECT 
    r.wsid
    , r.location
FROM test_bookings2 r
WHERE NOT (Startdate <= '2017-09-05' AND EndDate >= '2017-09-05')
换句话说,您要做的是返回给定日期内所有不活动的行。要在日期范围内的任意点检查活动,您需要说:

WHERE StartDate <= @EndDate AND EndDate >= @StartDate
这将返回在您的日期范围内任何时间点的所有实时预订

WHERE NOT(StartDate <= @EndDate AND EndDate >= @StartDate)
NOT反转结果,因此当它返回true时,它将变为false


然后,这将为您提供日期范围内所有不活动的行。

首先,您的表是否重复数据?你需要第一张桌子吗

WHERE NOT(StartDate <= @EndDate AND EndDate >= @StartDate)
其次,从只使用第二个表开始,测试\u bookings2

SELECT 
    r.wsid
    , r.location
FROM test_bookings2 r
WHERE NOT (Startdate <= '2017-09-05' AND EndDate >= '2017-09-05')
换句话说,您要做的是返回给定日期内所有不活动的行。要在日期范围内的任意点检查活动,您需要说:

WHERE StartDate <= @EndDate AND EndDate >= @StartDate
这将返回在您的日期范围内任何时间点的所有实时预订

WHERE NOT(StartDate <= @EndDate AND EndDate >= @StartDate)
NOT反转结果,因此当它返回true时,它将变为false


然后,这将为您提供日期范围内所有不活动的行。

您可能需要这样的内容:

WHERE NOT(StartDate <= @EndDate AND EndDate >= @StartDate)
    select * from first_table
    where
    not exists (
        select 1 from Second_table
        where 
        startDate <= '9/5/2017' and endDate >= '9/5/2017'
        and
        wsid = first_table.workstationid
    )
请注意,如果需要检查两个日期之间的重叠,而不是一个日期,则可以如下所示检查日期重叠:

...
where 
startDate <= 'higher_date_here' and endDate >= 'lower_date_here'

也许你需要这样的东西:

    select * from first_table
    where
    not exists (
        select 1 from Second_table
        where 
        startDate <= '9/5/2017' and endDate >= '9/5/2017'
        and
        wsid = first_table.workstationid
    )
请注意,如果需要检查两个日期之间的重叠,而不是一个日期,则可以如下所示检查日期重叠:

...
where 
startDate <= 'higher_date_here' and endDate >= 'lower_date_here'


问题和解决方案是,我的数据库中的日期是varchar,我必须对我的查询使用强制转换

问题和解决方案是,我的数据库中的日期是varchar,我必须对我的查询使用强制转换:。2017年9月5日的预期结果是什么?工作站2,3,4,5?是的,这是正确的@OtoShavadzePSA:。2017年9月5日的预期结果是什么?workstationids 2,3,4,5?是的,这是正确的@Otoshavadzez为什么不使用第一个表?如果bookings2表中没有某个工作站ID的预订,该怎么办。。此查询不适用于方法第一个表保留与第二个表的外键连接,第一个表管理工作站id及其位置第一个表保留现有工作站及其位置-第二个表仅保留预订,如预订历史对不起,由于WSID和位置的重复,您的表结构让我感到困惑。尝试此操作从测试中选择r.wsid、r.location,其中r.location='DownView'且不存在从测试中选择1,其中r.wsid=b.wsid和r.location=b.location和b.startDate='2017年9月5日'Nope,如果您切换符号,使StartDate=这将为您提供在指定日期/范围内活动的所有测试预订。为什么不使用第一个表?如果bookings2表中没有某个工作站ID的预订,该怎么办。。此查询不适用于方法第一个表保留与第二个表的外键连接,第一个表管理工作站id及其位置第一个表保留现有工作站及其位置-第二个表仅保留预订,如预订历史对不起,由于WSID和位置的重复,您的表结构让我感到困惑。尝试此操作从测试中选择r.wsid、r.location,其中r.location='DownView'且不存在从测试中选择1,其中r.wsid=b.wsid和r.location=b.location和b.startDate='2017年9月5日'Nope,如果您切换符号,使StartDate=这将为您提供在指定日期/范围内活动的所有测试预订。这是我所寻找的正确答案,导致我最终的解决方案是,当我执行查询select*from test_revision2时,较高的日期是start datequick question@OtoShavadze如果test_-revision2.location='Downsview'不存在,则从test_-bookings2中选择1,其中开始日期为'10/31/2017',test_-bookings2.wsid=test_-revision2.wsid,,则我得到的输出为2,3,4,5,然而,它应该是1..5,因为在我的数据库中没有该日期的预订,这真是太棒了buggy@rahulchawla-您确定在该时间间隔内没有预订地点吗?我刚刚在这里检查过:它工作正常,给出了第一张表的所有5行是的,我确定我的表中的最后一行是'10/9/2017-10/13/2017,它给了我2,3,4,5你必须投到日期吗?我的日期在我的数据库中是varchars,但它适用于某些场景@otoshavadzeth这是我寻找的正确答案,导致我最终的解决方案是,当我执行查询select*from test_revision2其中test_revision2.location='Downsview'时,较高的日期是起始日期快速问题@OtoShavadze,而不是退出从测试中选择1
_bookings2,其中起始日期为'10/31/2017',test_bookings2.wsid=test_revision2.wsid,,我得到的输出是2,3,4,5,但是它应该是1..5,因为我的数据库中没有该日期的预订,所以它实际上是buggy@rahulchawla-您确定在该时间间隔内没有预订地点吗?我刚刚在这里检查过:它工作正常,给出了第一张表的所有5行是的,我确定我的表中的最后一行是'10/9/2017-10/13/2017,它给了我2,3,4,5你必须投到日期吗?我的日期在我的数据库中是varchars,但它适用于某些场景@OtoShavadze