Data in MySQL vergelijken

Pagina: 1
Acties:

Onderwerpen


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Ik ben bezig met een reserveringssysteem. Ik heb daarin een tabel met twee data. Aankomst en vertrek:

MySQL tabel
Aankomst: 2010-09-13
Vertrek: 2010-09-16

Als ik nu een nieuwe reservering plaats, wil ik kijken of de data die geselecteerd wordt, niet een huidige reservering overlapt. Ik ga hierbij uit van:

Nieuwe reservering
Aankomst: 2010-09-14
Vertrek: 2010-09-15

SQL:
1
2
3
4
5
SELECT * FROM reserveringen 
WHERE 
 aankomst BETWEEN '2010-09-14' AND '2010-09-15'
OR
 vertrek BETWEEN '2010-09-14' AND '2010-09-15'


Dat werkt natuurlijk niet omdat beide (13 en 16 sept.) niet tussen de 14 en 15 september zitten.

Ik heb ook het volgende geprobeerd:

SQL:
1
2
3
4
5
SELECT * FROM reserveringen
WHERE 
  aankomst >= '2010-09-14'
AND
  vertrek <= '2010-09-15'


Ik dacht dit werkt, maar dit werkt ook niet natuurlijk. Ik ben hier al een paar dagen mee bezig en kijk mezelf er scheel op. Heeft iemand tips naar een MySQL functie waarmee ik data kan vergelijken? Ik zoek steeds op 'check between two dates MySQL' maar krijg dan alleen de functie BETWEEN terug waaraan ik niets heb.

Heldere post volgens mij :-) Ik vraag vriendelijk of iemand tips voor mij heeft.

Alvast bedankt.

Zenda likes some milk every now and then..


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 12:29
SQL:
1
2
3
4
5
SELECT * FROM reserveringen
WHERE 
  '2010-09-14' <= vertrek
AND
  '2010-09-15' >= aankomst

Niet getest..

Roomba E5 te koop


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Dank je wel. Die heb ik bij mezelf ook al eens voorbij zien komen :).

Ik ben nog even aan het prutsen geweest en volgens mij heb ik hem:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT *
FROM `reserveringen`
WHERE (
(
'2010-09-12'
BETWEEN aankomst
AND vertrek
)
OR (
'2010-09-17'
BETWEEN aankomst
AND vetrek
)
)
OR (
(
aankomst
BETWEEN '2010-09-12'
AND '2010-09-17'
)
OR (
vertrek
BETWEEN '2010-09-12'
AND '2010-09-17'
)
)
LIMIT 0 , 30;


Als je dit hebt:

Aankomst 13 - Vertrek 16

Dan covert hij nu:

12 - 17
14 - 15

14 - 17
12 - 15

Of zie ik nu nog iets over het hoofd?

Zenda likes some milk every now and then..


  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 12:45

Reptile209

- gers -

Helpt dit bijvoorbeeld? En meer leeswerk via [google=sql intersect dates]. :)

Zo scherp als een voetbal!


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 11:59
Ook eens mee zitten stoeien, ik geloof dat het zoiets was (even uit het hoofd, niet helemaal zeker) :

Aankomst <= 2010-09-15 and vertrek >= 2010-09-14


EDIT: is hetzelfde als wat sig69 zegt zo te zien, maar net wat anders verwoord. En een stuk eenvoudiger dan je huidige oplossing lijkt me.

[ Voor 32% gewijzigd door DigiK-oz op 09-09-2010 12:56 ]

Whatever


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Nog even los van de gegeven oplossingen. Wat je het beste kunt doen in situaties als deze is even een pen en een stuk papier pakken. Op dit papier ga je vervolgens middels tijdlijnen tekenen wat alle verschillende mogelijke situaties zijn (dat zijn er in dit geval een stuk of 6 tot 14, afhankelijk van of je samenvallende data ook meeneemt) en welke daarvan als overlap gelden, en welke niet. Vervolgens kun je vanaf hier een stuk makkelijker afleiden welke tests je nodig hebt.

Bijkomend voordeel is dat je deze gegevens vervolgens ook nog kunt verwerken in een unittest en op die manier ook (blijvend) aantonen dat je oplossing werkt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
DigiK-oz schreef op donderdag 09 september 2010 @ 12:52:
EDIT: is hetzelfde als wat sig69 zegt zo te zien, maar net wat anders verwoord. En een stuk eenvoudiger dan je huidige oplossing lijkt me.
Maar dit klopt dus niet. Als je data hebt die geboekt worden voor of na die data dan zit je al mis. Die van mij ziet er misschien wat ingewikkelder uit maar werkt wel goed voor alle data zoals ik aangeef in mijn post :-) Check die post van Jaroz ook even, zo heb ik het net ook gedaan. Goede tip.

Zenda likes some milk every now and then..


  • sh011265
  • Registratie: Februari 2010
  • Laatst online: 31-05-2023
Een van de 2 laatste checks mag nog weggelaten worden aangezien ze voor hetzelfde dienen, namelijk: de periode traceren die binnenin de timeslice valt.

Dus:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT * 
FROM `reserveringen` 
WHERE ( 
( 
'2010-09-12' 
BETWEEN aankomst 
AND vertrek 
) 
OR ( 
'2010-09-17' 
BETWEEN aankomst 
AND vetrek 
) 
) 
OR ( 
( 
aankomst 
BETWEEN '2010-09-12' 
AND '2010-09-17' 
)

[ Voor 46% gewijzigd door sh011265 op 09-09-2010 14:57 ]


  • cariolive23
  • Registratie: Januari 2007
  • Laatst online: 18-10-2024
Heeft MySQL geen operator OVERLAPS tot zijn beschikking?

SQL:
1
2
3
4
SELECT 
    (DATE '2010-09-14', DATE '2010-09-15') -- nieuwe reservering
    OVERLAPS
    (DATE '2010-09-13', DATE '2010-09-16'); -- tabelwaarde

Resultaat: true

Met andere woorden, er is sprake van overlap en dus moet je de reservering afkeuren.

In PostgreSQL kun je deze controle ook in een CHECK constraint opnemen, dan wordt het technisch onmogelijk om dubbele boekingen te maken. Je kunt dan zonder risico de extra SELECT weglaten, de INSERT van de nieuwe boeking zal keurig mislukken. Deze foutmelding kun je dan netjes gaan vertalen naar iets bruikbaars voor de gebruiker.

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 11:59
Zenda schreef op donderdag 09 september 2010 @ 13:36:
[...]


Als je data hebt die geboekt worden voor of na die data dan zit je al mis.
Hoe bedoel je? Kun je een voorbeeld geven?

Whatever


  • Zenda
  • Registratie: Oktober 2001
  • Laatst online: 06-09 16:17

Zenda

goes milk!

Topicstarter
Aankomst 13 - Vertrek 16

Dan covert hij nu:

12 - 17
14 - 15

14 - 17
12 - 15

Zenda likes some milk every now and then..


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Zenda schreef op donderdag 09 september 2010 @ 13:36:
Check die post van Jaroz ook even, zo heb ik het net ook gedaan. Goede tip.
Check ook de update edit in die post. ;)

Als je het tekent zie je dat het idioot simpel is (maar tegenintuitief klinkt ;) ):
2 periodes overlappen geheel of gedeeltelijk als het begin van periode A voor het einde van periode B ligt EN het einde van periode A na het begin van periode B ligt.
Dat zijn dus 2 vergelijkingen en je bent klaar.

{signature}


  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 11:59
Voutloos schreef op donderdag 09 september 2010 @ 19:54:
[...]
Check ook de update edit in die post. ;)

Als je het tekent zie je dat het idioot simpel is (maar tegenintuitief klinkt ;) ):
2 periodes overlappen geheel of gedeeltelijk als het begin van periode A voor het einde van periode B ligt EN het einde van periode A na het begin van periode B ligt.
Dat zijn dus 2 vergelijkingen en je bent klaar.
Dat dacht ik dus ook (zie mijn query), maar die klopt niet volgens TS?

Whatever


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dan faalt de ts. :P

Dit is ook een met regelmaat terugkerende vraag, en ik heb al een keertje of 10 het winnende antwoord gegeven O-)

{signature}

Pagina: 1