假设我们有一个表(table1),我们在其中存储4个值(user_id,name,start_date,end_date)
table1
------------------------------------------------
id user_id name start_date end_date
------------------------------------------------
1 1 john 2016-04-02 2016-04-03
2 2 steve 2016-04-06 2016-04-06
3 3 sarah 2016-04-03 2016-04-03
4 1 john 2016-04-12 2016-04-15
然后我输入2016-04-03的start_date和2016-04-03的end_date,以查看是否有任何用户可以安排作业。检查并忽略重叠日期的查询将返回以下内容:
table1
------------------------------------------------
id user_id name start_date end_date
------------------------------------------------
2 2 steve 2016-04-06 2016-04-06
4 1 john 2016-04-12 2016-04-15
我遇到的问题是John正在列表中显示,即使他已经预订了我正在搜索的日期的工作。对于其他条目,查询返回TRUE,因为日期不会发生冲突,但我想将John完全隐藏在列表中,因为他将不可用。
如果输入的日期与同一用户的另一个条目冲突,是否有办法过滤列表并阻止显示用户信息?
查询示例:
SELECT DISTINCT id, user_id, name, start_date, end_date
FROM table1
WHERE ('{$startDate}' NOT BETWEEN start_date AND end_date
AND '{$endDate}' NOT BETWEEN start_date AND end_date
AND start_date NOT BETWEEN '{$startDate}' AND '{$endDate}'
AND end_date NOT BETWEEN '{$startDate}' AND '{$endDate}');
答案 0 :(得分:0)
这会有用吗?
SELECT user_id DISTINCT FROM table1 WHERE (DATEDIFF(_input_,start_date) > 0 AND
DATEDIFF(_input_,end_date) > 0) OR
(DATEDIFF(_input_,start_date) < 0);
答案 1 :(得分:0)
&#34;解决方案&#34;在这个问题中看起来并不正确。
INSERT INTO table1 VALUES (5,2,'steve', '2016-04-01','2016-04-04')
现在,史蒂夫有一个重叠的行。
在问题中作为解决方案提出的查询将返回&#39; steve&#39;。
以下是构建查询以返回可用&#34;可用&#34;在请求的时间段内,因为table1中没有该行用于&#34;重叠&#34;请求期限。
第一个问题是由于存在与请求的时间段重叠的行而使不的用户可用。假设表中所有行的start_date&lt; = end_date ...
如果行的end_date处于打开状态,或者在所请求的句点开始之后,并且该行的start_date打开或之前,则行重叠请求的句点>请求期间的编辑。
-- users that are "unavailable" due to row with overlap
SELECT t.user_id
FROM table1 t
WHERE t.end_date >= '2016-04-03' -- start of requested period
AND t.start_date <= '2016-04-03' -- end of requested_period
GROUP
BY t.user_id
(如果我们假设start_date&lt; = end_date不成立,我们可以将该检查添加为查询中的条件)
要获取所有用户的列表,我们可以查询具有不同用户列表的表。我们在问题中看不到这样的表格,因此我们可以获得表格1中显示的所有用户的列表
SELECT l.user_id
FROM table1 l
GROUP BY l.user_id
要获取除不可用用户之外的所有用户的列表,我们可以通过以下几种方式编写该用户。最简单的是反连接模式:
SELECT a.user_id
FROM ( -- list of all users
SELECT l.user_id
FROM table1 l
GROUP BY l.user_id
) a
LEFT
JOIN ( -- users that are unavailable due to overlap
SELECT t.user_id
FROM table1 t
WHERE t.end_date >= '2016-04-03' -- start of requested period
AND t.start_date <= '2016-04-03' -- end of requested_period
GROUP
BY t.user_id
) u
ON u.user_id = a.user_id
WHERE u.user_id IS NULL