AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Überschneidung von Datumsbereichen finden?
Thema durchsuchen
Ansicht
Themen-Optionen

Überschneidung von Datumsbereichen finden?

Ein Thema von Sharky · begonnen am 6. Mai 2004 · letzter Beitrag vom 7. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#1

Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 07:15
Hai,

ich programmiere gerade ein Raumbuchungssystem. In der Tabelle mit den Buchungen habe ich zwei Datumswerten (von , bis).
Wenn jetzt eine neue Buchung für diesen Raum gemacht wird möchte ich prüfen ob der Raum zu diesem Zeitpunkt schon belegt ist.
Leider stehe ich total auf dem Schlauch heute Morgen

z.B.:

Raum 1 ist gebucht von 06.05.2004 10:30 bis 08.05.2004 18:00

Wenn jetzt jemand den Raum von 07.05.2004 12:00 bis 09.05.2004 17:30 buchen möchte muss er eine Meldung bekommen das der Raum zu diesem Zeitpunkt schon belegt ist.
  • Datenbank: mySQL
  • Zugriff: Zeos

Kann mir jemand auf die Sprünge helfen? Danke
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#2

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 07:20
Ist etwas früh , aber vielleicht geht das:
SQL-Code:
SELECT *
FROM DeineTabelle t
WHERE t.StartDTM < :i_EndDTM And t.EndDTM > :i_StartDTM
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 07:22
Ich hab sowas für meine Autovermietung gebraucht...ich habs aber im Programm abgefragt und nicht in SQL
Also:
IntStart1 = 06.05.2004 10:30
IntEnde1 = 08.05.2004 18:00
IntStart2 = 07.05.2004 12:00
IntEnde2 = 09.05.2004 17:30

Die Abfrage hat bei mir so gefunzt:
Delphi-Quellcode:
if (IntStart1 in [IntStart2..IntEnde2]) or (IntStart2 in [IntStart1..IntEnde1]) then
  ShowMessage(Intervallüberlappung');
Ich hab nur der Kürze wegen in verwendet, in Delphi funzt das nicht, da TDateTime ja Double ist. Deshalb musst du mit >= und <= arbeiten.

Dadurch wird abgefangen ob Int1 in Int2 liegt und umgekehrt
[edit]Noch eine Erklärung und den Code vervollständigt [/edit]
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#4

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 07:47
Hi!

Ich würde das so versuchen:
SQL-Code:
...
where BuchungStart between NeueBuchungStart and NeueBuchungEnd
   or BuchungEnd between NeueBuchungStart and NeueBuchungEnd
...
Viele Grüße
Markus
  Mit Zitat antworten Zitat
Luciano

Registriert seit: 17. Dez 2003
Ort: Großostheim
126 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 08:33
Hi...

Das mit dem Kleiner und Größer müßte eigentlich "kleiner gleich" und "größer gleich" heißen, wenn ich mich auf die schnelle nicht irre

Delphi-Quellcode:
  bisDatum := DateTimePicker8.Date;
  vonDatum := DateTimePicker7.Date;

  Anfrage1 := (' SELECT * FROM RESERVIE '+
               ' WHERE (ANREISE >= '+QuotedStr(DateToStr(vonDatum))+
               ' AND '+
               ' ANREISE >= '+QuotedStr(DateToStr(bisDatum))+')'+
               ' OR '+
               ' (ABREISE >= '+QuotedStr(DateToStr(vonDatum))+
               ' AND '+
               ' ABREISE <= '+QuotedStr(DateToStr(bisDatum))+')'+
               ' ORDER BY ANREISE, ABREISE ');
Das ist ein Reservierungsplan... Listet mir alle An- und Abreisen zwischen dem ausgewählten Datum auf. Sollte eigentlich auch bei dir funktionieren!

Greets

Luciano
Mike Santangelo
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 08:38
Danke euch,

ich werde es gleich einmal testen. Aber vorher brauche ich einen Kaffee.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#7

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 08:58
@Luciano
Natürlich hast du recht, ABER ...
Delphi-Quellcode:
  ...
  ' ANREISE >= '+QuotedStr(DateToStr(bisDatum))+')'+
  ...
.. sowas ist nicht nur generell Unsinn, mit einem Datumsfeld gehen diese Stringbasteleien auch noch mit 100%-iger in die Hose, wenn auch nur einer der Clients andere Regionaleinstellungen als der DB-Server hat.

Also:
SQL-Code:
SELECT *
FROM DeineTabelle t
WHERE t.StartDTM <= :i_EndDTM And t.EndDTM >= :i_StartDTM
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 09:07
Ich denke die Methode von Markus sieht ganz gut aus und funktioniert zumindest via MySQL-Control-Center wunderbar.

Delphi-Quellcode:
begin
  Query1.Close;
  Query1.SQL.Text := 'SELECT * FROM buchungen';
  Query1.Sql.Add ('WHERE ((BuchungStart BETWEEN :NeueBuchungStart and :NeueBuchungEnd)');
  Query1.Sql.Add ('OR (BuchungEnd BETWEEN :NeueBuchungStart and :NeueBuchungEnd))';
  Query1.Sql.Add ('AND (raum_id=:raum_id) AND (buchungs_id <> :buchungs_id)');
  Query1.ParamByName ('NeueBuchungStart').AsDateTime := start;
  Query1.ParamByName ('NeueBuchungEnde').AsDateTime := ende;
  Query1.ParamByName ('raum_id').AsInteger := raum_id;
  Query1.ParamByName ('buchungs_id').AsInteger := buchungs_id;
  Open;
end;
raum_id ist die ID des Raumes den ich buchen möchte.
buchungs_id brauche ich um, bei einer änderung der Buchung, nicht die eigene zu finden.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Luciano

Registriert seit: 17. Dez 2003
Ort: Großostheim
126 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 09:29
@Robert_G

Da hast du recht, mit den String.... für mehrere Clients ist das nicht gerade von Vorteil. Das Programm läuft bei mir allerdings nur auf MSDE lokal ohne andere Clients.

Greets


Luciano
Mike Santangelo
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#10

Re: Überschneidung von Datumsbereichen finden?

  Alt 6. Mai 2004, 21:27
Hallo nochmal!

Ich habe festgestellt, dass die von mir vorher vorgeschlagene Methode nicht alle möglichen Fälle abdeckt.
Die folgende Version sollte „wasserdicht“ sein:

SQL-Code:
where (
        (BuchungStart between NeueBuchungStart and NeueBuchungEnd)
        or
        (BuchungEnd between NeueBuchungStart and NeueBuchungEnd)
        or
        (BuchungStart <= NeueBuchungStart and BuchungEnd >= NeueBuchungEnd)
      )
Viele Grüße
Markus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz