我正在创建一个预订系统,我正在尝试编写一个查询,显示在给定时间哪些资源是免费的(允许用户选择预订哪些电台)
我的数据库中有两个表
第一张表
|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
答案 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,我不得不在查询中使用强制转换