Mysql

MYSQL查詢查找兩個日期範圍之間的記錄

  • January 17, 2019

我正在使用 PHP 和 MySQL 的 Web 應用程序中工作。

我有兩張桌子

  1. 員工
employee_id     email_id
3             tl1@jasmine.com
4             agent1@jasmine.com
5             agent2@jasmine.com
6             om1@jasmine.com
7             tl2@jasmine.com
  1. 輔導
coaching_id     emp_id  start_date  end_date
1               4      2014-05-01  2014-10-02
2               5      2014-12-18  2015-01-22

我想要一個查詢來找出在指定日期範圍(例如開始日期“2015-01-22”和結束日期“2015-03-12”之間)沒有註冊任何教練計劃的員工。

現在我正在使用這樣的查詢,

SELECT employee_id 
FROM employee 
WHERE sup_id = 3 
AND employee_id NOT IN 
(
   SELECT emp_id 
   FROM (coaching) 
   WHERE (start_date NOT BETWEEN "2014-12-26" AND "2015-01-30") 
   AND (end_date NOT BETWEEN "2014-12-26" AND "2015-01-30")

)

我有一個邏輯,“如果任何員工在給定的 start_date 和 end_date 已經加入了教練計劃,他就沒有資格參加任何教練計劃。

**例如:**如果開始日期是“2014-12-26”,結束日期是“2015-01-30”。
那麼 ID 為 5 的員工沒有資格參加此輔導計劃,因為他現在正在進行另一項輔導活動,其開始日期為“2014-12-18”,結束日期為“2015-01-22”。
但是 ID 為 4 的員工以及所有其他未參加任何輔導活動的員工都有資格

我的查詢中的問題在哪裡

謝謝

您的查詢有一個邏輯缺陷:它試圖找到不在有輔導的人列表中的人,但前提是輔導不在目標視窗中。

相反,在employee_id 上加入員工和教練表,使用employee 中的所有行,但僅使用coaching 中stop_date 晚於或等於所需開始日期(coaching 在視窗開始後結束)且start_date 小於的行或等於所需的停止日期(輔導在視窗結束前開始)。然後在指導中排除具有一個或多個匹配行的員工。

SELECT e.id AS employee_id
 FROM employee e
 LEFT JOIN coaching c ON c.employee_id = e.id
                     AND c.end_date >= '2014-12-26'
                     AND c.start_date <= '2015-01-30'
WHERE c.employee_id IS NULL;

現場展示:http ://sqlfiddle.com/#!9/79b39/4

引用自:https://dba.stackexchange.com/questions/87031