[SQL] Werken met datums in join query

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 15:20
Ik heb nog nooit gewerkt met de datum functies in MySQL en weet niet zo goed waar ik moet beginnen bij het probleem wat ik nu heb. Misschien dat iemand hier mij op weg kan helpen. De situatie is alsvolgt:

Ik heb een tabel met huisjes en een tabel met al gemaakte reserveringen voor een bepaald huisje.

Nu ben ik de zoekfilter van de huisjes aan het uitbreiden met het filteren op periode. Als ik een periode invul dan wil ik alleen huisjes te zien krijgen die in de ingevulde periode nog beschikbaar zijn.

De structuur ziet er nu zo uit:

HUISJES
----------------
ID
NAAM

HUISJES_RESERVERINGEN
-------------------------------------------
HUIS_ID
FROM (date)
TO (date)

In de werkelijke situatie heb ik al een aantal tabellen gejoind voor de huisinformatie compleet te krijgen, maar dat is voor hier even onbelangrijk.

Stel ik heb de volgende reservering voor huis #1:

07-01-2011 t/m 22-01-2011

Bij mijn filter geef ik in dat ik alle huizen wil zien die vrij zijn in de periode: 01-01-2011 t/m 08-01-2011. Dat bekent dat huis #1 niet in mijn resultaten lijst mag komen.

Ik handel dat nu niet af in de database maar in mijn code, onefficient en komt de snelheid niet ten goede vooral gezien het feit dat de database met huizen aan het groeien is. Ik weet zeker dat dit direct via SQL af te handelen is, maar weet niet hoe. De documentatie van MySQL helpt mij niet aan de juiste functies heb ik het idee.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 12:47

Dido

heforshe

Ofwel zijn alle vakantieparken in Nederland non-stop hun database aan het redesignen, of er is een veelvoorkomende les/cursusmethode waarvan dit een huiswerkopdracht is.
Volgens mij is de volledige oplossing hiervoor bij elkaar te vinden door te zoeken op "huisje".

Maar goed, denk eens goed na waarom huisje #1 niet in je resultaat mag voorkomen. Welke datum moet je daarvoor met welke datum vergelijken? Is dat de enige vergelijking die je moet maken, of moet er nog een vergelijking gemaakt worden?

SQL heeft geen ingebakken functie om te bepalen of een huisje vrij is, maar wel om te kijken of een datum groter is dan een andere datum ;)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 15:20
Ja dat is iets wat ik nu in de code afhandel:

Ik zal de datum uit de startpost gebruiken:

Reservering: 07-01-2011 t/m 22-01-2011

Stel ik zoek een huisje van 2011-01-08 t/m 2011-01-15 dan kan ik dat heel simpel matchen natuurlijk, want die valt in de reserveringsdatum.

Stel ik zoek van 2011-01-01 t/m 2011-01-08 dan kan dat ook niet want de tot datum valt in de reservering.

Stel ik zoek van 2011-01-22 t/m 2011-01-29 dat mag wel want de zaterdag is een wisseldag en de week erna zijn geen reserveringen.

Acties:
  • 0 Henk 'm!

  • Xerantius
  • Registratie: Mei 2004
  • Laatst online: 23-03 10:44
Ik denk dat het handiger is als je een voorbeeld query post.
Dan kan ik je een antwoord geven...

Acties:
  • 0 Henk 'm!

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 16:44
Kijk eens naar dit topic.

Whatever


Acties:
  • 0 Henk 'm!

  • T i M
  • Registratie: April 2004
  • Laatst online: 15:20
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT * 
FROM `accommodation_book` 
WHERE(
'2011-01-01' > `from`
AND '2011-01-08' < `to`
) OR (
'2011-01-01' BETWEEN `from`
AND `to`
)
 OR (
'2011-01-08' BETWEEN `from`
AND `to`
)


Hiermee haal ik de reserveringen op die binnen die datum vallen en dat ziet er goed uit. Had gedacht dat er wat meer uit de halen zou zijn met de ingebakken MySQL functies.

Acties:
  • 0 Henk 'm!

  • jbdeiman
  • Registratie: September 2008
  • Laatst online: 16:02
Goed, stel je hebt een van/ tot datum:

In principe moet je hiervan uitgaan:

De startdatum voor de nieuwe aanvraag moet liggen voor de einddatum van de huidige bezetting && de einddatum voor de aanvraag moet liggen na de startdatum van de huidige bezetting.
Ook wanneer de start- en einddatum van de nieuwe aanvraag liggen tussen de start en einddatum van de reeds geplaatste reserveringen gaat dat goed.

Dus:
WHERE
(from < '2011-01-08' AND to > '2011-01-01')

Wel wat kort door de bocht, je hebt wel een paar uitzonderingsmogelijkheden geloof ik, maar voor wat je nu wil moet dit volgens mij prima voldoen.

Ps. Eigenlijk moet je het nog wel een beetje omdraaien, want je wilt de vrije ruimtes. De vrije ruimtes zijn die ruimtes die je niet terug krijgt ;) Niet de meest ideale oplossing, maar het voldoet.

Anders moet je kijken naar 3 opties, en die heb je daar eigenlijk al genoemd. Een kant en klare functie is er in elk geval niet.

Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 12:47

Dido

heforshe

Ja, laten we de zoveelste persoon die met hetzelfde huiswerk komt het antwoord gaan voorkauwen, jbdeiman ;)

T i M: "ja" is geen antwoord op de vragen die is stelde. Beantwoord die nu eens? Je wilt helemaal niet met "between"werken, en alles wat jij omschrijft kan in kinderlijk eenvoudige SQL uitgewerkt worden. Je weet alleen niet wat je wil - dat is de basis van 99% van alle SQL-vragen.

Vertel eens in hele simpele regeltjes waaraan de reserveringsdata van je huisjes moeten voeldoen om wel of niet geslecteerd te worden.

Wat betekent mijn avatar?

Pagina: 1