我的表格结构如下:
Events (id, name, start, end, venue)
Venues (id, name)
Events.start
和end
表示事件的开始和结束日期时间。 Events.veuue
是Venues
的外键。我想在一个时间范围内选择所有可用的场地。 SQL可能是什么样的。目前,我很难搞清楚......
答案 0 :(得分:2)
您需要NOT EXISTS
才能从Events
获取与您的时间范围不重叠的行。我认为这应该做的工作:
SELECT v.id, v.name
FROM
Venues v
WHERE NOT EXISTS (
SELECT venue FROM Events e
WHERE [searchdate] BETWEEN start AND end
AND v.id = e.venue
)
以上使用单个日期时间[searchdate]
。如果您需要开始/结束日期范围来检查场地,请使用WHERE
条款,如:
WHERE
[searchstartdate] BETWEEN start AND end
OR [searchenddate] BETWEEN start AND end
因此,如果[searchstartdate]
或[searchenddate]
与事件重叠,则会匹配一行。
答案 1 :(得分:0)
如果这是MS SQL。
SELECT distinct Venues.id, Venues.Name
FROM Venues
INNER JOIN Events
ON Venues.id = Events.venue
WHERE @startdatetime between Events.start and Events.end
OR @enddatetime between Events.start and Events.end
修改强> 如果我理解你的澄清,你需要在搜索日期之间搜索一个地点。
SELECT distinct Venues.id, Venues.Name
FROM Venues
INNER JOIN Events
ON Venues.id = Events.venue
WHERE @searchdatetime not between Events.start and Events.end