"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

sql access datums vergleich ! help pls

FunFragga 30.01.2003 - 22:56 3878 9
Posts

FunFragga

OC Addicted
Avatar
Registered: Mar 2001
Location: .us|FL
Posts: 1005
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
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
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

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
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 :p
Bearbeitet von watchout am 31.01.2003, 00:13 (kleiner fehler - ka obs einfluss hat)

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Zitat von watchout
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

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11338
Die einfachste Bedingung um zu testen, ob sich zwei Bereiche überlappen, ist:

(range1.from < range2.to and range2.from < range1.to)

Vivo

Dreamworker
Avatar
Registered: May 2002
Location: Tal der Könige
Posts: 1478
Zitat von that
range1.from < range2.to and range2.from < range1.to
Right ... so isses genialer ... ein NOT davor und fertig ...

FunFragga

OC Addicted
Avatar
Registered: Mar 2001
Location: .us|FL
Posts: 1005
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!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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.
Code:
|----------------------------> 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
Avatar
Registered: Mar 2001
Location: .us|FL
Posts: 1005
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!
Avatar
Registered: Sep 2002
Location: HTTP/1.1 404
Posts: 2782
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz