![]() |
freien Belegungszeitraum ermitteln
Hallo,
ich habe mehrere Räume die belegt werden können. Die Belegungszeiten werden in eine Firebird DB eingetragen. Tabellenfelder: ID, anfang, ende, raum. Mit einer SQL-Abfrage möchte ich herausfinden, welcher Raum für einen bestimmten Zeitraum frei ist. Mit dieser Abfrage funktioniert es:
SQL-Code:
aber nur solange der Raum einmal in der Tabelle eingetragen ist.
select distinct raum
from T_DATEN where not (ende > '12.01.2004' and anfang < '18.01.2004') and Raum = 5 Bei mehrfacher Eintragung wird der Raum als frei ausgegeben, obwohl er für den Abfragezeitraum belegt ist. Ich hoffe, ich habe mich einigermassen verständlich ausgedrückt und mir kann jemand auf die Sprünge helfen. Gruss Rolf |
Re: freien Belegungszeitraum ermitteln
Hallo Rolf,
versuche es doch mal mit einem Subselect. Das könnte in etwa so aussehen (ungetestet!):
SQL-Code:
select distinct raum
from T_DATEN where not exists (select raum from T_DATEN where (ende > '12.01.2004' and anfang < '18.01.2004'); |
Re: freien Belegungszeitraum ermitteln
Hallo Rainer,
vielen Dank für die Antwort, aber es funktioniert nicht. Gruss Rolf |
Re: freien Belegungszeitraum ermitteln
Hallo Rolf,
dann erläutere doch bitte mal, was nicht funktioniert. |
Re: freien Belegungszeitraum ermitteln
hallo rolf, ich habe mal etwas ähnlich realisiert. es lief auf einem webserver. es wurden freie zeiten eingetragen und die belegtzeiten werden in einem grid eingetragen. gleichzeitig wurden diese denkzellen mit ir sensoren vernetzt, um die belegung auf dem grid anzuzeigen. so war es möglich einen raum im vierten stock zu betreten obwohl sich das eigene büro im erdgeschoß befand. leider war ich nur für die hardware zuständig auf die software hatte phillips die hand drauf, dürfte aber nicht so schwierig sein. jedenfalls ist das eine sehr effektive variante die räume zu überwachen . sollte nur mal so zur anregung dienen.
raik |
Re: freien Belegungszeitraum ermitteln
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Rainer,
das Ergebins der Abfrage ist null obwohl alle Räume ausser 3 und 5 frei sind. Siehe Bild von Tabelle im Anhang. Gruss Rolf |
Re: freien Belegungszeitraum ermitteln
vielleicht so
SQL-Code:
select distinct raum from T_daten where not between '12.01.2004 ' and '18.01.2004'
|
Re: freien Belegungszeitraum ermitteln
@kiar
nee, nicht wirklich. Die Daten stehen im Feld anfang und ende. Gruss Rolf |
Re: freien Belegungszeitraum ermitteln
Hallo Rolf,
Zitat:
|
Re: freien Belegungszeitraum ermitteln
hallo rolf
dann ersetze das das datum durch anfang und ende |
Re: freien Belegungszeitraum ermitteln
Hallo Rainer,
Zitat:
Gruss Rolf |
Re: freien Belegungszeitraum ermitteln
Ich glaube so könnte es gehen:
SQL-Code:
Wenn Start- oder Endzeit zwischen den gegeben Werten stehen, gilt der Raum als belegt.
SELECT COUNT(t.raum) CountRes
FROM T_Daten t WHERE t.Raum = :RaumNo AND t.Raum NOT IN (SELECT x.Raum FROM T_Daten x WHERE x.Anfang BETWEEN :StartTM AND :EndTm OR x.Ende BETWEEN :StartTM AND :EndTm) Hoffe ich habe dein Problem richtig verstanden. |
Re: freien Belegungszeitraum ermitteln
Hallo GeorgeWNewbie,
ja, es funktioniert. Ich habe die Abfrage etwas angepasst.
SQL-Code:
SELECT distinct t.raum
FROM T_Daten t WHERE t.raum = :raumNo AND t.raum NOT IN (SELECT x.raum FROM T_Daten x WHERE x.Anfang BETWEEN :StartTM AND :EndTm OR x.Ende BETWEEN :StartTM AND :EndTm) Vielen Dank Rolf |
Re: freien Belegungszeitraum ermitteln
Hallo Rolf,
mir ist nicht ganz klar, was die Abfrage t.raum = :raumNo bezwecken soll. Alle freien Räume solltest Du so erhalten
SQL-Code:
select distinct raum
from Belegung where Raum not in (select Raum from Belegung where ende between '12.01.2004' and '18.01.2004' or anfang between '12.01.2004' and '18.01.2004'); |
Re: freien Belegungszeitraum ermitteln
Hallo,
mein Problem ist leider noch nicht gelöst. Wenn ein Raum vom '12.01.2004' bis '18.01.2004' als belegt eingetragen ist und ich frage nach '14.01.2004' bis '16.01.2004' wird auch der belegte Raum als frei zurück gegeben. Nur wenn ich die gebuchten Zeiten abfrage, wird der Raum als nicht frei zurück gegeben. Aber so kommt es zur Kollision. |
Re: freien Belegungszeitraum ermitteln
Stimmt. :?
|
Re: freien Belegungszeitraum ermitteln
Probiers mal so
SQL-Code:
[edit]hatte jetzt doch glatt das falsche Datum[/edit]
select distinct raum
from Belegung where Raum not in (select Raum from Belegung where '14.01.2004' between anfang and ende or '16.01.2004' between anfang and ende); hoffe es klappt |
Re: freien Belegungszeitraum ermitteln
Und was hältst Du davon?
SQL-Code:
select distinct raum
from Belegung where Raum not in (select Raum from Belegung where '14.01.2004' between anfang and ende or '16.01.2004' between anfang and ende); |
Re: freien Belegungszeitraum ermitteln
Hey, ich komm ja gar nicht hinterher :lol:
ich will nicht nerven, aber wenn ich abfrage: '10.01.2004' bis '22.01.2004' wird der Raum als frei zurück gegeben. :wall: |
Re: freien Belegungszeitraum ermitteln
Hi, wie wärs denn mit
SQL-Code:
?
Where Start <= '16.01.2004' AND Ende >= '14.01.2004'
|
Re: freien Belegungszeitraum ermitteln
Was Du so alles wissen willst. :lol: Probiere es doch mal mit einer Kombination aus beidem:
SQL-Code:
select distinct raum
from Belegung where Raum not in (select Raum from Belegung where '10.01.2004' between anfang and ende or '22.01.2004' between anfang and ende or ende between '10.01.2004' and '22.01.2004' or anfang between '10.01.2004' and '22.01.2004'); |
Re: freien Belegungszeitraum ermitteln
Also, da find ich meine Idee aber irgendwie... naja, kürzer :gruebel:
|
Re: freien Belegungszeitraum ermitteln
So funktionierts bei mir:
SQL-Code:
Gruß,
select raum
from Belegung where raum not in ( select raum from Belegung where ((:von between anfang and ende) or (:bis between anfang and ende) or (:von <= anfang and :bis >= anfang) or (:von <= anfang and :bis >= ende))) Marcel |
Re: freien Belegungszeitraum ermitteln
Zitat:
|
Re: freien Belegungszeitraum ermitteln
Das Problem an meiner vorherigen Lösung war, dass Einträge, die vor :StartTm begannen/ nach :EndTm endeten, nicht erfasst wurden.
Versuch's mal so:
SQL-Code:
Kam hier aber bestimmt schon in irgendeinem Posting vor.
SELECT DISTINCT t.Raum
FROM T_Daten t WHERE t.Raum NOT IN (SELECT x.Raum FROM T_Daten x WHERE (x.Anfang BETWEEN :StartTm AND :EndTm OR x.Ende BETWEEN :StartTM AND :EndTm) OR x.Anfang <= :StartTm AND x.Ende >= :StartTm) @Treffnix Mach's dir nicht zu einfach - es wird nicht funktionieren. Was ist wenn das Enddatum kleiner als :EndTm aber größer als :StartTm ist? |
Re: freien Belegungszeitraum ermitteln
Zitat:
Dann ist Ende grösser als 14.01.2004 und passt somit ins Where-Statement, oder steh ich jetzt aufm Schlauch? Mal ein paar Beispiele, die eigentlich alle Fälle abdecken sollten: Annahme: StartTm = 12.01.2004, EndTm = 16.01.2004
SQL-Code:
Where Start <=:EndTm And Ende >=:StartTm
Code:
*edit* da fehlten noch doppelpunkte *edit*
Start Ende
10.01. - 19.01. Where 12.01.2004 <= 19.01.2004 And 16.01.2004 >= 10.01.2004 True 13.01. - 15.01. Where 12.01.2004 <= 15.01.2004 And 16.01.2004 >= 12.01.2004 True 10.01. - 15.01. Where 12.01.2004 <= 15.01.2004 And 16.01.2004 >= 10.01.2004 True 15.01. - 21.01. Where 12.01.2004 <= 21.01.2004 And 16.01.2004 >= 15.01.2004 True 09.01. - 10.01. Where 12.01.2004 <= 10.01.2004 And 16.01.2004 >= 09.01.2004 False ( links ) 18.01. - 20.01. Where 12.01.2004 <= 20.01.2004 And 16.01.2004 >= 18.01.2004 False ( rechts ) *edit2* 2 Werte vertauscht *edit2* |
Re: freien Belegungszeitraum ermitteln
Sorry TreffNix, hab' mich verguckt... :pale:
Anscheinend hast du vollkommen recht. Mann (:wall: :wall: :wall: :wall:), manchmal müsste ich akutes Post-Verbot kriegen. :duck: (Manchmal denkt man, die Lösung sei kompliziert - also macht man sie auch kompliziert...) Wenn TreffNix' Lösung bei dir nicht funktioniert dann liegt das ganz einfach an impliziter Umwandlung von String zu Datum. Füge nicht " '14.01.2003' " in deine Abfrage ein, sondern verwende Variablen, die du als Datum definierst. Denn implizite Umwandlung bedeutet einen ziemlichen CPU-Overhead auf dem Server. |
Re: freien Belegungszeitraum ermitteln
Hallo GeorgeWNewbie,
ich habe jetzt erst die Tests fahren können und es sieht sehr sehr gut aus. Vielen Dank, auch für die Beiträge von den Anderen. :hello: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz