sql access datums vergleich ! help pls
FunFragga 30.01.2003 - 22:56 3878 9
FunFragga
OC Addicted
|
hi, also ich brauche für access eine sql abfrage und zwar: die abfrage soll ein datum vergleichen ... also das ist für ein schul projekt, wir haben hotelverwaltung ->
gast1 hat zimmer 1 von 1.2 - 7.2, gast2 ruft an und will von 4.2 - 6.2 = zimmer darf nicht mehr aufscheinen da es ja um die zeit schon belegt ist = es dürfen nur die zimmer aufscheinen die zu der zeit noch frei sind ....
bin für jeden hinweis sehr dankbar, bzw url oder was auch immer
|
Vivo
Dreamworker
|
Also ich setz jetzt mal voraus dass du SQL beherrschst und sag einfach wie ichs machen würde : datVon ... datBis - Jeweils das Datum bei denen das Zimmer belegt ist datVonAkt ... DatBisAkt - Das Datum nachdme abgefragt werden soll ob in diesem Zeitraum das Zimmer noch verfügbar ist So und jetzt machst du einfach eine Select Anweisung mit folgender Bedinung ... datVon > DatBisAkt AND datBis > DatBisAkt OR datVon < datVonAkt AND datBis < DatVonAkt::Hätt ich eigentlich gleich den SQL String hinschreiben können ... Naja, egal ... musst ja auch was zutun haben
|
watchout
Legendundead
|
wenn du das feld als typ "datum" definiert hast, dann kannst du einen simplen vergleich machen - also <,>,= für die zb heute freien: select * from tabölle where not datumfeld=date(); für die an einem bestimmten tag freien (afaik is das format abhängig von den ländereinstellungen): select * from tabölle where not datumfeld='31.01.2003'; bzw. bei einem bereich: select * from tabölle where '29.01.2003'>datumfeld AND datumfeld>'31.01.2003'; edit: i provide the strings
Bearbeitet von watchout am 31.01.2003, 00:13 (kleiner fehler - ka obs einfluss hat)
|
Vivo
Dreamworker
|
select * from tabölle where '29.01.2003'>datumfeld AND datumfeld>'31.01.2003'; Gerade noch editiert ... ich hätts schon im Quote gehabt
|
that
ModeratorHoffnungsloser Optimist
|
Die einfachste Bedingung um zu testen, ob sich zwei Bereiche überlappen, ist:
(range1.from < range2.to and range2.from < range1.to)
|
Vivo
Dreamworker
|
range1.from < range2.to and range2.from < range1.to Right ... so isses genialer ... ein NOT davor und fertig ...
|
FunFragga
OC Addicted
|
tjo @vivo habe leider 0 plan von sql könntest du mir den string hinschreiben ... oder is der von watchout eh in ordnung ? edit: bzw irgendwie geht das nicht wircklich ... ich schreib schnell die tabellen auf die was es gibt: tb_reservieren = da sind die res. daten drinnen von den gästen (datum von bis) tb_zimmer = zimmernr, preis/nacht, usw usf wie müste da jetzt der SQL string ausschauen ? ich hab mal das zusammen bekommen: SELECT tb_reservierung.startdat > fo_datumsuchen.AktDatBis AND tb_reservierung.enddat > fo_datumsuchen.AktDatBis OR tb_reservierung.startdat < fo_datumsuchen.AktDatVon AND tb_reservierung.enddat < fo_datumsuchen.AktDatVon die "fo_datumsuche..." sind die eingabe felder von dem Formular
Bearbeitet von FunFragga am 31.01.2003, 18:00
|
atrox
in fairy dust... I trust!
|
ohne daß wir deine tabellenstruktur kennen, können wir dir keine exakten string aufschreiben. wenn du allerdings eine hotelverwaltung in access machst und nicht genug sql kannst um die lösungen von vorher zu _adaptieren_ ... wie hast du dann den rest der hotelverwaltung geschrieben ? aber selbst wenn du nur die klick-oberfläche für abfragen verwendet hast, kannst du die lösung von vorher adaptieren...wenn du zeitspanne A von A_anfang bis A_ende dauert, und analog bei zeitspanne B, dann sind A und B genau dann nicht überlappend, wenn (A.ende vor B.anfang) oder B.ende vor A.anfang). jede andere kombination bedeutet eine überschneidung. |----------------------------> Zeit
A.ende vor B.anfang: OK
[A..........]
[B.........]
B.ende vor A.anfang: OK
[A...........]
[B..........]
jede andere konstelation geht nicht:
[A..........]
[B..........]
oder
[A...........]
[B.........]
oder
[A.........]
[B....................]
oder
[A...................]
[B........]
statt aber auf jede mögliche kollisionsart zu prüfen, ist es einfacher nur die fälle zu prüfen wo keine kollision stattfindet. gegebenenfalls kann man ja immer noch negieren.
Bearbeitet von atrox am 31.01.2003, 17:54 (spelling)
|
FunFragga
OC Addicted
|
ich hab meinen letzten post edited ... gugs dir nochmal an pls bzw wir machen nur die gäste verwaltung eines hotels und bis auf diese datums abfrage haben wir noch nie wircklich etwas mit sql code machen müssen ...
|
atrox
in fairy dust... I trust!
|
SELECT <feldername(n)> FROM <tablename(n)> WHERE <bedingung>
unter der annnahme, dass anfangsdatum immer kleiner ist als enddatum:
select r.zimmernummer from tb_reservierung r WHERE r.startdat > fo_datumsuchen.AktDatBis OR r.enddat < fo_datumsuchen.AktDatVon fall du die zimmerdaten ausgeben willst, brauchst du ein join mit der zimmer-tabelle.
PS: wenn du den rest ohne sql gelöst hast, kannst du das hier auch über die klick-oberfläche lösen.
|