获取两个日期

时间:2017-05-07 17:53:12

标签: mysql sql

我遇到一个查询有困难,所以我需要在两个日期之间选择所有可用的服务员,我有这样的表

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的服务员。

2 个答案:

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