SQL检查可用的场地

时间:2012-02-23 03:25:03

标签: sql

我的表格结构如下:

 Events (id, name, start, end, venue)
 Venues (id, name)

Events.startend表示事件的开始和结束日期时间。 Events.veuueVenues的外键。我想在一个时间范围内选择所有可用的场地。 SQL可能是什么样的。目前,我很难搞清楚......

2 个答案:

答案 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