Mysql 安排在某个日期范围内工作。我试图让我发布的示例保持简单,这就是为什么我没有提到另一个表的原因。下次我肯定需要更详细的描述。@DonnyK:这对我来说不是问题。我只是指出,要获得“所有用户”的列表,我们可能不希望依赖(不幸命名的)表“table1”。 ta
Mysql 安排在某个日期范围内工作。我试图让我发布的示例保持简单,这就是为什么我没有提到另一个表的原因。下次我肯定需要更详细的描述。@DonnyK:这对我来说不是问题。我只是指出,要获得“所有用户”的列表,我们可能不希望依赖(不幸命名的)表“table1”。 ta,mysql,date,distinct,overlapping,Mysql,Date,Distinct,Overlapping,安排在某个日期范围内工作。我试图让我发布的示例保持简单,这就是为什么我没有提到另一个表的原因。下次我肯定需要更详细的描述。@DonnyK:这对我来说不是问题。我只是指出,要获得“所有用户”的列表,我们可能不希望依赖(不幸命名的)表“table1”。 table1 ------------------------------------------------ id user_id name start_date end_date ------------------
安排在某个日期范围内工作。我试图让我发布的示例保持简单,这就是为什么我没有提到另一个表的原因。下次我肯定需要更详细的描述。@DonnyK:这对我来说不是问题。我只是指出,要获得“所有用户”的列表,我们可能不希望依赖(不幸命名的)表“table1”。
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
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
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}');
SELECT user_id DISTINCT FROM table1 WHERE (DATEDIFF(_input_,start_date) > 0 AND
DATEDIFF(_input_,end_date) > 0) OR
(DATEDIFF(_input_,start_date) < 0);
INSERT INTO table1 VALUES (5,2,'steve', '2016-04-01','2016-04-04')
-- 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
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