Zum Inhalt springen

SQL query für Zeitraum


Lord_Aratorn

Empfohlene Beiträge

Hi, ich sitze hier, und bin fast am verzweifeln.

Also ich habe eigentlich ein ziemlich einfaches Problem.

Ich habe mehrere Benutzer, die alle ein Auto mieten können, und zwar von einem Zeitpunkt eine gewisse Anzahl an Tagen. Dabei darf ein Auto nicht von 2 Leuten gemietet werden

ich habe aktuell 2 Tabellen.

USERS( login, name, name,.....)

CARS (carid, rentingdate, duration, endingdate)

Meine Abfrage, die ich bisher habe

Select * from CARS where carid = $carid and urentingdate < rentingdate and uendingdate > endingdate

ich habe aber stehts das problem, dass ein auto mehrmals belegt wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also dann baue ich mal ne schöne grafik

____Cars____

carid|ausleihdatum|ausleihzeitraum|rückgabe|user

1 | 0.1.09 | 4 | 5.1.09 | max

2 | 7.1.09 | 3 | 10.1.09 | knut

1 | 7.1.09 | 6 | 13.1.09 | Horst

wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum sollte es nicht mit 2 Entitys machbar sein?

Ich habe alle benötigten Informationen.

Der einzige Grund warum 2 Entitys schlecht sind, sind die Redundanzen, aber die habe ich eh.

Ich habe gedacht, dass ich das Query 2x ausführe und miteinander joine. Und dann in dem Join schaue ob es einen Zeitraum gibt, den ich belegen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

warum sollte es nicht mit 2 Entitys machbar sein?

Ich habe alle benötigten Informationen.

Bist du sicher ? Dann hast du aber nicht alle Informationen gepostet...

ich habe aktuell 2 Tabellen.

USERS( login, name, name,.....)

CARS (carid, rentingdate, duration, endingdate)

- Du hast alle Benutzer

- Du hast die Verleihdaten der Wagen

- Aber : Welcher Benutzer welchen Wagen "besetzt" hält, gibt es nicht ??...(Siehe die Antwort von Flashpixx)

Gruss

Link zu diesem Kommentar
Auf anderen Seiten teilen

So wirklich seh ich immernoch nich wo dein Problem ist.. vielleicht bin ich einfach nur zu doof?!

aber wenn du:

wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze

machen moechtest... ist das doch ne ganz einfache logische abfrage?!


Select
*
from
CARS
where
carid = 1
AND '2009-01-02' NOT BETWEEN rentingdate and endingdate
AND '2009-01-15' NOT BETWEEN rentingdate and endingdate
[/PHP]

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mich würden ja mal die Keys interessieren, denn carid kann es ja nicht sein, denn dann lässt sich das Auto auch nur einmal verleihen. Die Kombination aus carid, rentingdate und endingdate macht auch keinen Sinn, denn das Auto 1 ist ja am 1.4 bis 10.4 und am 1.8 bis 2.8 immer noch das Auto 1 und ändert sich nicht. Außerdem ist es inner sinnvoll zu sagen, welchen Datentyp die Datumsfelder haben (date, timestamp, unixtimestamp)

Phil

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bist du sicher ? Dann hast du aber nicht alle Informationen gepostet...

- Du hast alle Benutzer

- Du hast die Verleihdaten der Wagen

- Aber : Welcher Benutzer welchen Wagen "besetzt" hält, gibt es nicht ??...(Siehe die Antwort von Flashpixx)

Gruss

Ach stimmt, mein Fehler.

Natürlich sieht die Tabelle Cars so aus

CARS (carid, rentingdate, duration, endingdate, login)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Was hat bitte ein "login" in der Car-Entitiy zu suchen?

Warum hast Du eine duration, wenn Du Start und Endzeit hast?

zu meinem letzten Post

Welche Datentypen verwendest Du?

Wie sehen die Schlüssel auf der Tabelle aus?

Phil

Hi,

So wie ich es verstehe, ist dies eigentlich nicht die "CAR" Eintität, sondern "Buchungen" oder "Ausleihen" ,wie auch immer. Eine Entität "CAR" hat er nicht.Das Login wäre in diesem Fall der FK auf den Benutzer...aber dieses Datenmodell ist sicher renovationsbedürftig :-).

na ja...

Link zu diesem Kommentar
Auf anderen Seiten teilen

USERS( login:varchar16, name:varchar16, nam:varchar16,.....)

CARS (carid:int, rentingdate:date, duration:int, endingdate:date, login:forreignkey aus USERS)

zu meinem Vorposter, ja quasi ist Cars eine Buchungstabelle.

Ich wollte die Anzahl an Tabellen gering halten. Man könnte natürlich auch jeweils eine Tabelle für USERS,CARS,RENT wobei dies die Beziehungen beider abbildet. Ich könnte natürlich auch IDs eiführen, jedoch halte ich dies für überflüssig

Link zu diesem Kommentar
Auf anderen Seiten teilen

Und was ist auf Cars der PK?

es spielt doch fuer das was er nun machen will gar keine Rolle?!

es ist egal ob nun PK -> carsid + rentingdate oder carsid + endingdate <- ist oder gar alle 3 zusammen.

das es nicht normalisiert ist, hatte er auch schon selbst zugegeben.

und die eigentlich Frage war ja

wenn nun Frank auto 1 mieten will und zwar vom 2.1.09 bis 15.1.09 muss mir die abfrage false liefern oder 0 datensätze

und da sind die PKS total irrrelavant

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also nun habe ich die Tabellen ein wenig umgebaut.

Ich habe nun 3

USERS( login:varchar16, name:varchar16, nam:varchar16,.....)

CARS (carnr:int, preis/tag:double, anzahlreifen:int)

RESERVATIONS (rentid: int, carnr: int (FK aus CARS) rentingdate:date, endingdate:date, login:varchar(FK aus USERS)

nun muss stehe ich aber immernoch vor meinem alten problem:

Select 
*
from
RESERVATIONS
where
carnr = $carnr
AND $uin_date NOT BETWEEN rentingdate and endingdate
AND $uout_date NOT BETWEEN rentingdate and endingdate [/PHP]

erhalte ich nicht das gewünschte, vielmehr kann ich nicht nachvollziehen warum ich die Ausgabe erhalte, die ich erhalte. Ich bekomme stehts datensätze, auch wenn das auto eigentlich frei sollte.

Bearbeitet von Lord_Aratorn
Link zu diesem Kommentar
Auf anderen Seiten teilen

sry wieder verschrieben

RESERVATIONS

muss es heißen

ich vermute mal, dass die Abfrage FALSE liefert, bei folgender Situation

......................|----dur1-----|.........................|-------dur2--------|

................................................................................................

........^...............................................^....................................

.........|.----------abfragedur--------------|....................................

....start.............................................end................................

obwohl das Auto in dem zwischenraum vermietet wird

Bearbeitet von Lord_Aratorn
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich hab das gerade mal mit deiner neuen Tabelle ausprobiert.

meinen SQL von Seite eins etwas erweitert, kann man allerdigns sicher noch etwas anders machen


Select 

 if(count(id) > 0, 'NEIN', '') as 'kann verliehen werden'

from 

  rents

where 

  carnr = 1

 AND (

 '2008-12-03' BETWEEN rentingdate and endingdate 

 OR '2009-12-04' BETWEEN rentingdate and endingdate

 OR rentingdate BETWEEN '2008-12-03' AND'2009-12-04'

 OR endingdate BETWEEN '2008-12-03' AND '2009-12-04'

)

GROUP BY carnr

edit: damit is dann auch dein problem ausm letzten post behoben

Ted

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...