Hallo,
seit gestern sitze ich an einer eigentlich einfachen Abfrage, ohne sie auf die Reihe zu kriegen. Es geht um die Selektion von Datensätzen, zu denen in der verknüpften Tabelle keine Einträge enthalten sind, die sich innerhalb eines bestimmtes Zeitraums (Datum) befinden.
Es gibt zwei (relevante) Tabellen:
tbl_objects:
obj_id (PK)
tbl_objects_in_use:
use_id (PK)
obj_id (FK)
start_date (datetime)
end_date (datetime)
In der Tabelle tbl_objects befinden sich irgendwelche Einträge irgendwelcher Gegenstände. Diese Gegenstände können zur selben Zeit nur einmal benutzt werden, also beginnend mit Datum x und endend mit Datum y. Wird ein Objekt genutzt oder eine Nutzung in der Zukunft geplant, so erfolgt ein Eintrag in der Tabelle tbl_objects_in_use mit den beiden Daten (start_date und end_date).
Ich benötige nun eine Abfrage, die mir alle Objekte liefert, die innerhalb eines gegebenen Zeitraumes nicht benutzt werden.
Beispiel:
Objekt 1 wird benutzt:
vom 22.10.2009 bis zum 29.10.2009
vom 02.11.2009 bis zum 12.10.2009
vom 28.11.2009 bis zum 12.12.2009
Objekt 2 wird benutzt:
vom 24.10.2009 bis zum 28.10.2009
vom 29.10.2009 bis zum 15.11.2009
Objekt 3 wird benutzt:
vom 26.11.2009 bis zum 27.11.2009
Und nun möchte ich alle Objekte selektieren, die vom 14.11.2009 bis zum 27.11.2009 nicht benutzt werden. In diesem Beispiel wäre das nur Objekt 1.
Aus meiner (offensichtlich falschen) einzigen logischen Lösungsmöglichkeit dreht sich alles um eine Abfrage, die der folgenden immer ähnlich sind. Brauchbare Daten liefert sie jedoch bedauerlicherweise nicht. Leider erschließt sich mir auch nicht, wo der Fehler ist.
Irgendwo muss ich einen gewaltigen Denkfehler haben, denn an sich klingt die Problematik, etwas zu selektieren, das zwischen zwei Daten keine verknüpften Einträge enhält, ja gar nicht so kompliziert ...
Hat jemand eine Idee?
pb
seit gestern sitze ich an einer eigentlich einfachen Abfrage, ohne sie auf die Reihe zu kriegen. Es geht um die Selektion von Datensätzen, zu denen in der verknüpften Tabelle keine Einträge enthalten sind, die sich innerhalb eines bestimmtes Zeitraums (Datum) befinden.
Es gibt zwei (relevante) Tabellen:
tbl_objects:
obj_id (PK)
tbl_objects_in_use:
use_id (PK)
obj_id (FK)
start_date (datetime)
end_date (datetime)
In der Tabelle tbl_objects befinden sich irgendwelche Einträge irgendwelcher Gegenstände. Diese Gegenstände können zur selben Zeit nur einmal benutzt werden, also beginnend mit Datum x und endend mit Datum y. Wird ein Objekt genutzt oder eine Nutzung in der Zukunft geplant, so erfolgt ein Eintrag in der Tabelle tbl_objects_in_use mit den beiden Daten (start_date und end_date).
Ich benötige nun eine Abfrage, die mir alle Objekte liefert, die innerhalb eines gegebenen Zeitraumes nicht benutzt werden.
Beispiel:
Objekt 1 wird benutzt:
vom 22.10.2009 bis zum 29.10.2009
vom 02.11.2009 bis zum 12.10.2009
vom 28.11.2009 bis zum 12.12.2009
Objekt 2 wird benutzt:
vom 24.10.2009 bis zum 28.10.2009
vom 29.10.2009 bis zum 15.11.2009
Objekt 3 wird benutzt:
vom 26.11.2009 bis zum 27.11.2009
Und nun möchte ich alle Objekte selektieren, die vom 14.11.2009 bis zum 27.11.2009 nicht benutzt werden. In diesem Beispiel wäre das nur Objekt 1.
Aus meiner (offensichtlich falschen) einzigen logischen Lösungsmöglichkeit dreht sich alles um eine Abfrage, die der folgenden immer ähnlich sind. Brauchbare Daten liefert sie jedoch bedauerlicherweise nicht. Leider erschließt sich mir auch nicht, wo der Fehler ist.
Code:
SELECT obj.obj_id FROM tbl_objects obj LEFT JOIN tbl_objects_in_use use ON obj.obj_id = use.obj_id WHERE ( use.start_date < '2009-10-16 07:30:00' OR use.start_date > '2009-10-17 07:30:00' OR use.use_id IS NULL ) AND ( use.end_date < '2009-10-16 07:30:00' OR use.end_date > '2009-10-17 07:30:00' OR use.use_id IS NULL ) GROUP BY obj.obj_id
Hat jemand eine Idee?
pb
Kommentar