预订SQL查询

时间:2017-09-06 17:28:55

标签: sql-server database tsql

我正在创建一个预订系统,我正在尝试编写一个查询,显示在给定时间哪些资源是免费的(允许用户选择预订哪些电台)

我的数据库中有两个表

第一张表

|workstationid | location|
+--------------+---------+
|     1        |Downsview|
|     2        |Downsview|
|     3        |Downsview|
|     4        |Downsview|
|     5        |Downsview|

第二张表

|wsid |location    |email       |duration |startDate |endDate |
+-----+------------+------------+---------+----------+--------+
|  1  | Downsview  | randomemail|    5    | 9/4/2017 |9/8/2017|

我正在执行的查询是

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')

然而,查询中的问题是它将所有5个位置都返回为可用,但是您可以在我的第二个表中看到从9月4日到9月8日为工作站1预订。

 workstationid   location
       1          Downsview
       2          Downsview
       3          Downsview
       4          Downsview
       5          Downsview

3 个答案:

答案 0 :(得分:3)

可能你需要这样的东西:

    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'

答案 1 :(得分:1)

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

其次,仅使用第二个表test_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)

不会反转结果,所以当它返回true时,而不是假。

然后,这应该为您提供日期范围内无效的所有行。

答案 2 :(得分:0)

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