我遇到一个查询有困难,所以我需要在两个日期之间选择所有可用的服务员,我有这样的表
attendant {
id,
name
}
job {
id,
attendantId,
name,
startDate,
endDate
}
我需要做的是让所有在2个日期之间没有工作的服务员。
我正在尝试通过此查询来实现这一目标,但出于某些原因,我不会在提供的日期之间找不到忙碌的服务员
SELECT a.id, a.firstName, a.lastName, a.phoneNumber, a.address, a.attendantType
FROM attendant a
WHERE a.id NOT IN (
SELECT attendantId FROM job
WHERE startDate <= PROVIDED_END_DATE AND endDate >= PROVIDED_START_DATE
)
例如,如果我为受助人John Doe工作,从2017年1月1日到2017年1月1日,如果我选择从1.11.2017到2017年1月15日获得所有可用的服务员,我需要将John Doe作为可用的服务员,例如,如果我从1.09.2017到1.15.2017选择我需要的服务员,我不应该得到John Doe,因为很明显他在那个时期很忙(1.09。和1.10)。长话短说,我需要在特定时期内找回不在工作表中的服务员。
根据我当前的查询,我遇到了问题,因为当NOT IN子句返回0行时我不会得到其他服务员。
这是我的数据库中的示例,我有一个看起来像这样的工作:
Job {
attendantId: 1,
startDate: 2017-05-01,
endDate: 2017-05-06
}
我的查询如下:
SELECT a.id, a.firstName, a.lastName, a.phoneNumber, a.address, a.attendantType
FROM attendant a
WHERE a.id NOT IN (
SELECT c.attendantId FROM job j
WHERE j.startDate <= "2017-05-24" AND j.endDate >= "2017-05-20"
)
并且我希望能够返回id为1的服务员。
答案 0 :(得分:1)
我认为你的代码很接近。希望以下内容适合您:
SELECT
a.id,
a.firstName,
a.lastName,
a.phoneNumber,
a.address,
a.attendantType
FROM attendant a
WHERE
NOT EXISTS (SELECT c.attendantId
FROM job j
WHERE j.startDate <= "2017-05-24"
AND j.endDate >= "2017-05-20"
AND a.id = c.attendantId
)
答案 1 :(得分:0)
尝试:
select * from attendant
inner join
(select attendantId from job where PROVIDED_START_DATE > endDate or PROVIDED_END_DATE < startDate) t
on
attendant.id = t.attendantId