it-swarm.com.de

MYSQL-Abfrage zum Suchen von Datensätzen zwischen zwei Datumsbereichen

Ich arbeite in einer Webanwendung mit PHP und MySQL).

Ich habe zwei Tische

  1. Mitarbeiter

    employee_id     email_id
    3             [email protected]
    4             [email protected]
    5             [email protected]
    6             [email protected]
    7             [email protected]
    
  2. Coaching

    coaching_id     emp_id  start_date  end_date
     1               4      2014-05-01  2014-10-02
     2               5      2014-12-18  2015-01-22
    

Ich möchte eine Abfrage, um herauszufinden, welche Mitarbeiter nicht für ein Coaching-Programm zwischen einem bestimmten Zeitraum wie Startdatum "2015-01-22" und Enddatum eingeschrieben sind "2015-03-12".

Jetzt verwende ich eine solche Abfrage.

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")

)

Ich habe eine Logik: "Wenn ein Mitarbeiter bereits zu einem bestimmten Start- und Enddatum an einem Coaching-Programm teilgenommen hat, ist er für kein Coaching-Programm berechtigt.

Zum Beispiel : Wenn das Startdatum '2014-12-26' und das Enddatum '2015-01-30' ist.
Dann ist der Mitarbeiter mit ID 5 nicht für dieses Coaching-Programm berechtigt, da er sich jetzt in einer anderen Coaching-Aktivität befindet, deren Startdatum "2014-12-18" und Enddatum "2015-01-22" ist.
Mitarbeiter mit ID 4 sind jedoch ebenso berechtigt wie alle anderen Mitarbeiter, die keine Coaching-Aktivität ausüben

Wo ist das Problem in meiner Anfrage

Vielen Dank

2
Bikram Pahi

Ihre Anfrage hat einen logischen Fehler: Sie versucht, Personen zu finden, die NICHT in der Liste der Personen mit Coaching aufgeführt sind, jedoch nur, wenn sich das Coaching NICHT im Zielfenster befindet.

Verbinden Sie stattdessen die Mitarbeiter- und Coaching-Tabelle auf employee_id, indem Sie alle Zeilen im Mitarbeiter verwenden, aber nur Zeilen im Coaching, bei denen das stop_date später oder gleich dem gewünschten Startdatum ist (Coaching endet nach dem Start des Fensters) und das start_date kleiner als ist oder gleich dem gewünschten Stoppdatum (Coaching beginnt vor dem Ende des Fensters). Schließen Sie dann die Mitarbeiter mit einer oder mehreren übereinstimmenden Zeilen im Coaching aus.

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;

Live-Demo: http://sqlfiddle.com/#!9/79b39/4

5