Date range test

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Medior/senior Back-end developer wanted!

Functie Because of the growth within the company, we are looking for reinforcement in the devlopmenttean. As a back-end developer you build the company software that helps us with the primary processes. A fun (internal) project in which you continuously develop the software! You will work in a small team, we have daily stand-ups and a scrum session every fortnight, led by our Scrum Master. During these sessions, you get the opportunity to present your ideas and discuss them with your fellow developers and the Product Owner. Within the development teams, we use Trello, Gitlab, Jiira, Confluence and Boockstack. They

Bekijk vacature »

Medior Java developer (fullstack)

Wat je gaat doen: Of beter nog, wat wil jij doen? Binnen DPA GEOS zijn we dan ook op zoek naar enthousiaste Java developers om ons development team te versterken. Als Java developer werk je in Agile/Scrum teams bij onze klanten en daarbij kun je eventueel ook andere ontwikkelaars begeleiden in het softwareontwikkelproces. Verder draag je positief bij aan de teamgeest binnen een projectteam en je kijkt verder dan je eigen rol. Je gaat software maken voor verschillende opdrachtgevers in jouw regio. Je bent een professional die het IT-vak serieus neemt en kwaliteit levert. Je leert snel vanwege je diepgaande

Bekijk vacature »

.Net ontwikkelaars voor de zorgsector

Bedrijfsomschrijving Voor onze klant in de omgeving van Zwolle zijn wij op zoek naar een ervaren .Net ontwikkelaar, bij voorkeur met ervaring binnen de belangrijkste sector van Nederland, namelijk: de zorgsector. Deze internationale organisatie ontwikkelt software voor de zorgsector. Er werken zo'n 25 medewerkers hard aan een oplossing die gebruikt wordt door heel Nederland. Er heerst een informele sfeer waarbij er altijd ruimte is voor een grapje. Je collega's zijn stuk voor stuk sterke ontwikkelaars vanuit verschillende achtergronden en met verschillende leeftijden. Je komt hier terecht in een organisatie die zich hard inzet om de zorgsector te verbeteren. De mogelijkheden

Bekijk vacature »

T-SQL Database developer

Functie omschrijving Ben jij een ETL database specialist? Houd jij ervan om te puzzelen met Databases, Query's & Stored procedures? Zoek jij uitdaging, vrijheid en verantwoordelijkheid? Zoek dan niet verder! Wij zijn per direct op zoek naar medior en senior database developers. Je gaat werken voor een relatief klein softwarebedrijf in omgeving Tilburg. Samen met 12 collega's (allemaal techneuten), ga jij je bezig houden met het bouwen en/of onderhouden van database software. Deze software wordt internationaal ingezet voor het automatiseren van logistieke processen. Jouw werkzaamheden gaan er als volgt uit zien: Je bent in een klein team met developers, verantwoordelijk

Bekijk vacature »

Social Media Specialist

Social Media Specialist locatie: Rotterdam (Zuid Holland) Wij zoeken op korte termijn een nieuwe collega, een social media specialist/ adviseur sociale media (24 uur), voor ons sprankelende team Communicatie van CJG Rijnmond. Onze focus ligt op het informeren en binden van onze in- en externe klanten en stakeholders en het versterken van onze naamsbekendheid en zichtbaarheid. Dat doen we in nauwe samenwerking met elkaar. Over de functie Ons team bestaat uit 7 communicatieprofessionals met ieder een eigen expertise. Als lid van het online team ben je verantwoordelijk voor het ontwikkelen, uitvoeren en analyseren van onze socialemediastrategie. Ook stel je campagnes

Bekijk vacature »

C# Developer

Functie omschrijving Voor een softwarebedrijf in de omgeving van Veghel zijn we op zoek naar een C# developer. Word jij blij van ontwikkelen in C# en .NET? Lees dan snel verder! Jouw werkzaamheden zullen er als volgt uit gaan zien: Door middel van ASP.NET, MVC Framework en C# ga je webshops, websites en webapplicaties ontwikkelen. Je zorgt voor de optimalisatie van bestaande software en de automatisering van bedrijfsprocessen. Op basis van de wensen van de klant ga je samen met je collega's ga je op zoek naar de juiste oplossingen en je gaat dit uitwerken tot een mooi eindproduct. Bedrijfsprofiel

Bekijk vacature »

Creatieve Front-end developer gezocht!

Functie Het front-end team bestaat momenteel uit 4 collega’s en is hard aan het groeien! Samen leveren jullie een essentiële bijdrage aan de applicaties die ze voor hun klanten realiseren. Je werkt in het front-end team samen met de back-end teams en product owners om te zorgen dat de applicaties een fijne gebruikerservaring opleveren. Jouw expertise zorgt ervoor dat de juiste keuzes gemaakt worden qua techniek en ontwerp, van back-end tot aan gebruiker. In samenspraak met je team bepalen jullie de beste keuze voor techniek. Ook is er altijd ruimte om nieuwe technieken te ontdekken. Eisen • Je hebt gedegen

Bekijk vacature »

Back-End Web Developer

As a Back-End Web Developer at Coolblue, you ensure that our webshops work as optimal as possible. How do I become a Back-End Web Developer at Coolblue? As a Back-End Web Developer you work together with other development teams to make our webshop work as optimal as possible and to make our customers happy. Although you are a PHP Developer, you also feel confident with setting up microservices in Typescript or are open to learning this. Would you also like to become a PHP Developer at Coolblue? Read below if the job suits you. You enjoy doing this Writing pure

Bekijk vacature »

Junior/Medior Front-end developer

Functie Als Front-end developer werk je intensief samen met 1 van de UX-designers en denk je mee over de gebruiksvriendelijkheid en design van onze web- en mobile apps. Je bent betrokken bij sessies met gebruikers om designs te valideren en usability van de app-in-wording te testen. Vervolgens gebruik je dit om samen met je team waarin ook back-end (.NET) developers zitten, te zorgen voor de realisatie van de best mogelijke apps voor studenten en docenten. Eisen • Je hebt een hands-on development en coding mind-set en werkt graag aan een high quality code base welke je consequent onderhouden kan worden

Bekijk vacature »

Anaplan Developer

Dit ga je doen What are you going to do: Picking up Stories: Design planning had, how are we going to build it in Anaplan; Talking to the end user to build a forecasting model; Having contact with the data team about which data is needed; Being able to convert an Excel sheet into a 3, 4 or 5 dimensional modeling environment; Giving knowledge sessions about Anaplan; Solving incidents; Making instructional videos on how teams should read forecasts; Writing blogs about forecasting. Hier ga je werken We are looking for an Anaplan Builder to deliver end-to-end solutions within a big

Bekijk vacature »

.NET Developer

Dit ga je doen Programmeren in .NET, Javascript & C# en ontwikkelen in Web Services, Windows Services en MS SQL Server; Zelfstandig verbanden maken Analyseren, testen, bugs fixen, reviewen en rapporteren; Juiste prioriteiten stellen en verantwoordelijkheid nemen; Op architectuur niveau meedenken; Af en toe klanten bezoeken. Hier ga je werken Voor onze relatie zijn wij opzoek naar een .NET ontwikkelaar met minimaal 3 jaar werkervaring. Je komt te werken in een groeiend bedrijf met betrokken collega's die zorgen voor een familiaire sfeer op de werkvloer. Als .NET ontwikkelaar word jij vanaf de eerste werkdag betrokken bij het gehele ontwikkelproces. De

Bekijk vacature »

Back end developer Python, PHP

Functie Jij als full stack ontwikkelaar zult komen te werken samen met 1 PHP ontwikkelaar een PO en een flexibele schil aan ontwikkelaars . Samen ga je ervoor zorgen dat de huidige producten doorontwikkeld worden. De marketplace is geschreven in PHP Laravel en in de front end React. De roostersoftware is ontwikkeld in Python in combinatie met React in de front end. Jij zult voornamelijk (lees 75%) werken aan de roostersoftware. Momenteel ligt de uitdaging in het feit dat de roostersoftware breder schaalbaar moet worden zodat het voor meerdere flexwerkers ingezet kan worden. Verder willen ze financiële koppelingen gaan maken

Bekijk vacature »

Junior .NET developer

Functie Als junior .NET Core developer wordt jij onderdeel van ons team met drie breed ontwikkelde software engineers en een flexibele schil met zes ervaren freelancers. Jij gaat mee in de visie van onze organisatie om als IoT partner in deze branche specifieke markt “het” platform te blijven innoveren en deze ook steeds slimmer te maken. Wij hopen dan ook zeker dit in de toekomst te kunnen realiseren met bijvoorbeeld Artificial Intelligence. De architectuur van ons platform is opgemaakt uit een deel eigen protocol, een interface laag en een laag welke de protocollen van derde partijen vertaald naar het eigen

Bekijk vacature »

Front-end developer E-Commere

Functie E-commerce is een ‘’snelle’’ wereld. Om hierin continu voorop te blijven omarmen ze in een vroeg stadium nieuwe technieken. Een webshop is nooit af en kan altijd beter, sneller en efficiënter. Tegelijkertijd hebben ze vanaf hun oprichting altijd vastgehouden aan kwaliteit boven snelheid, en dit loont. Als front-end developer heb je een adviserende rol en sta je aan het eindpunt van alles wat met designs te maken heeft. Je overlegt met klanten en collega’s, en zet je in om ideeen om te zetten tot unieke concepten. Je bent het aanspreekpunt voor de klant en bewaakt tevens de planning. Eisen

Bekijk vacature »

Frontend Developer

Dit ga je doen Door ontwikkelen van het online platform Deel uitmaken van verschillende ontwikkelteams Meedenken over UI/UX vraagstukken Uitdragen van Front-end binnen de organisatie Hier ga je werken Deze organisatie, gevestigd in de omgeving van Amsterdam, is een grote onderwijs instelling met meerdere vestigingen en een groot aantal studenten. Zo telt deze organisatie +/- 35.000 gebruikers. Bij deze organisatie staat jouw ontwikkeling centraal en is er veel ruimte voor eigen initiatieven. In samenwerking met jouw team ga jij de online omgeving verder ontwikkelen. In de rol van Front end Developer zal jij 50% van jouw tijd werken in het

Bekijk vacature »

Pagina: 1 2 volgende »

Lars Anderson

Lars Anderson

18/12/2012 12:20:20
Quote Anchor link
Ik heb een mooie hersenbreker voor jullie:

De feiten:
- Ik heb 2 kamers beschikbaar.
- Een kamer kan voor één of meerdere dagen gereserveerd worden.
- Een date range mag op dezelfde dag beginnen als een andere date range eindigt

De query:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$query
= "
SELECT *
FROM reserveringen
WHERE `reservering_eind` > '"
. $datum1 . "'
AND `reservering_start` < '"
. $datum2 . "'
"
;
?>




Met behulp van bovenstaande query kan ik bepalen hoeveel reserveringen er zijn in de gekozen date range van $datum1 tot $datum2. Als er 2 resultaten zijn, betekent dit dat er geen kamers beschikbaar zijn.

Echter als de date range die ik wil testen bijvoorbeeld een week of een maand beslaat. Dan kunnen er zelfs meer dan 2 reserveringen gevonden worden. Ook als alle gevonden reserveringen na elkaar op kamer 1 geboekt kunnen worden.

Hoe kan ik nu testen of de gevonden reserveringen elkaar overlappen. Want als ze dat niet doen zou de kamer wel nog beschikbaar zijn.

Voorbeeld:
reservering #1: 01 jan 2012 tot 02 jan 2012
reservering #2: 02 jan 2012 tot 03 jan 2012
reservering #3: 03 jan 2012 tot 04 jan 2012

Test input:
reservering #4: 01 jan 2012 tot 04 jan 2012

Bovenstaande (foute) query geeft terug dat er reeds 3 reserveringen zijn in periode 01 tot 04 jan 2012. De query zou terug moeten geven dat er van de 2 beschikbare kamers er slechts max 1 in gebruik is tijdens de gevraagde periode.
Iemand enig idee hoe ik dit kan doen?

EDIT:
Vincent opperde het volgende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$query
= "
SELECT COUNT(*), kamer_id
FROM reserveringen
WHERE reservering_eind >  $datum1
AND reservering_start <  $datum2
GROUP BY kamer_id
HAVING COUNT(*)=0
"
;
?>

Echter de reserveringen hebben niet altijd een kamer_id. Als een reservering toegevoegd word, wordt er niet direct een kamer_id gekoppeld. Dit kan later gedaan worden.

Iemand een idee over hoe dit op te lossen?
 
PHP hulp

PHP hulp

13/03/2025 20:48:51
 
No One

No One

18/12/2012 12:25:44
Quote Anchor link
de query omkeren. dus eigenlijk kijken of je nog kamers overhebt in die periode.
dan selecteer je het aantal reserveringen, en dat aantal vergelijk je met het aantal kamers dat je hebt. dan heb je bijvoorbeeld 45 reserveringen, 50 kamers, kan er voor die periode nog 5x een reservering geplaatst worden. echter zou ik die query wat ingewikkelder maken..want als je al je kamers geboekt zijn van 10 december tot 27 december..gaat reserveren van bijvoorbeeld 8 december tot 15 december natuurlijk ook niet... alleen 8 en 9 december zijn dan nog kamers vrij ;)
Gewijzigd op 18/12/2012 12:29:28 door No One
 
Lars Anderson

Lars Anderson

18/12/2012 12:30:09
Quote Anchor link
Volledig mee eens, maar hoe ga ik dat aanpakken?
 
John D

John D

18/12/2012 12:30:14
Quote Anchor link
en >= $datum alsmede <= $datum gebruiken.
 
Erwin H

Erwin H

18/12/2012 12:30:27
Quote Anchor link
Je zal voor elke dag tussen je begin en einddatum moeten bepalen hoeveel reserveringen er zijn. Is er maar 1 dag in die periode waar er evenveel reserveringen zijn als dat er kamers zijn dan kan je niet meer reserveren.

Maar dan heb je nog niet het probleem opgelost van welke kamer. Zolang niet alle reserveringen aan kamers zijn toegewezen zal je dat vrees ik ook niet 1-2-3 lukken.


Toevoeging op 18/12/2012 12:31:55:

John D op 18/12/2012 12:30:14:
en >= $datum alsmede <= $datum gebruiken.

Nee. Een reservering voor 1 nacht loopt van 1 januari tot 2 januari. Maar op 2 januari is die kamer wel weer beschikbaar.
 
No One

No One

18/12/2012 12:40:06
Quote Anchor link
@Erwin, mee eens, maar niet helemaal...die kamer_id komt ergens vandaan dus ik neem aan dat hij een tabel heeft met kamers count(kamer_id) as c from kamers en je hebt het aantal kamers..
 
Erwin H

Erwin H

18/12/2012 12:43:07
Quote Anchor link
@Henze, op welk punt heeft dat betrekking?
 
No One

No One

18/12/2012 12:44:53
Quote Anchor link
Het probleem van de kamers...overigens alle kamers die niet toegewezen zijn - het aantal reserveringen zonder kamers = aantal vrije kamers
 
Erwin H

Erwin H

18/12/2012 12:50:10
Quote Anchor link
Maar welke kamer? Stel je wilt een kamer een maand lang. Het feit dat er elke dag nog 1 kamer vrij is, wil niet zeggen de zelfde kamer elke dag. Zolang niet elke reservering aan een kamer is toegewezen kan je dus niet zeggen dat die reservering mogelijk.
 
No One

No One

18/12/2012 13:02:26
Quote Anchor link
Erwin H op 18/12/2012 12:50:10:
Maar welke kamer? Stel je wilt een kamer een maand lang. Het feit dat er elke dag nog 1 kamer vrij is, wil niet zeggen de zelfde kamer elke dag. Zolang niet elke reservering aan een kamer is toegewezen kan je dus niet zeggen dat die reservering mogelijk.


zodra je reserveert weet het systeem: maakt niet uit welke kamer deze 4 zijn die hele periode nog vrij... bij een volgende reservering bij een soort gelijke periode ziet ie: oh, nog 3 vrij...enzv...in die periode heb je dan 4 kamers verdeeld over 4 personen die elke een ander bereik hebben binnen die periode..maar dat maakt niet uit...er is altijd een kamer voor wie dan ook. met drie kamers in de periode van 1 december tot 10 december: jij komt van 4 tot 7, ik kom van 1 tot 6 en iemand anders komt de gehele periode. dan is het duidelijk dat er sowieso 1 kamer vrij is van 1 tot 4 en van 6 tot 10 als die kamers die dagen geboekt zijn kan je op het scherm waarin je als nog een kamer toekent tonen welke kamers dus vrij zijn op de gereserveerde datums..
Gewijzigd op 18/12/2012 13:03:48 door No One
 
Lars Anderson

Lars Anderson

18/12/2012 13:10:13
Quote Anchor link
Ik zal proberen het iets verder toe te lichten:
Ik heb kamer type A, B en C
Er zijn 2 type A kamers (kamernummer 1A en 2A), 4 type B en 6 type C kamers.

Nu is er een reservering van 1 dec tot 2 dec in een type A kamer (de reservering is toegewezen aan kamernummer 1A)
en er is een reservering van 2 dec tot 3 dec (deze reservering is nog niet toegewezen aan een kamer).

Nu wil ik een reservering gaan doen van 1 dec tot 3 dec.

Met mijn eerste query krijg ik alle reserveringen terug in de periode 1 dec tot 3 dec. Dit zijn er 2. Dit is gelijk aan het aantal beschikbare kamers dus wordt mijn reservering geweigerd. MAAR dit is natuurlijk niet zo. Want ik kan de tweede reservering toewijzen aan kamernummer 1A. Kamernummer 2A is dan nog gewoon beschikbaar in deze periode.

Ik ben inderdaad bang dat ik zoals Erwin al zei (Erwin H 18/12/2012 12:30:27) dat ik per dag van de datum range die ik wil controleren zal moeten gaan kijken of er nog kamers beschikbaar zijn op die dag. Of heeft er iemand nog een betere oplossing waarmee dit met één query zou kunnen?
 
Erwin H

Erwin H

18/12/2012 13:13:20
Quote Anchor link
@Henze: Jammer, maar zo simpel is het niet. Ja, er is elke dag een kamer vrij, maar het hoeft niet dezelfde kamer te zijn over de hele periode. Daarmee kan je die extra reservering misschien nog wel aanvaarden, maar je kan die dan niet aan 1 kamer toewijzen (en ik neem aan dat de meeste mensen niet van kamer willen veranderen in die periode).

Neem het volgende voorbeeld voor een hotel met 2 kamers:
R1)1 jan - 3 jan kamer 1
R2)4 jan - 6 jan kamer 1
R3)2 jan - 4 jan kamer 2
R4)5 jan - 7 jan kamer 2
Nu zie je dat als ik van 3 januari tot 5 januari wil boeken, ik de eerste nacht in kamer 1 zou kunnen zitten en de tweede nacht in kamer 2. Zolang er verder geen reserveringen zijn zou je kamers kunnen omgooien, maar zelfs dat zou onacceptabel kunnen zijn als mensen specifiek een kamer willen hebben.


Toevoeging op 18/12/2012 13:14:45:

Lars Anderson op 18/12/2012 13:10:13:
Ik ben inderdaad bang dat ik zoals Erwin al zei (Erwin H 18/12/2012 12:30:27) dat ik per dag van de datum range die ik wil controleren zal moeten gaan kijken of er nog kamers beschikbaar zijn op die dag. Of heeft er iemand nog een betere oplossing waarmee dit met één query zou kunnen?

Dit kan al met 1 query.
Gewijzigd op 18/12/2012 13:13:50 door Erwin H
 
No One

No One

18/12/2012 13:22:38
Quote Anchor link
@Erwin... gebeurt regelmatig...heb het ook regelmatig meegemaakt. en dan zou ik willen zeggen: had dan bij reservering een kamernummer opgegeven of gevraagd om uitzicht op zee...dan heeft de dienstdoende persoon een kamer toegewezen die uitzicht op zee heeft. overigens gebeurt dat geswap van kamers alleen voor mensen die later reserveren.

in jou hotel zijn de reserveringen dus al gekoppeld aan kamernummers. maar als jij die kamernummers niet weet, dan weet je nog wel dat je de eerste nacht maar 1 kamer vrij hebt welke dat is maakt niet uit. als iemand langer wil zul je dus wie het eerst maalt systeem moeten gebruiken: de persoon die eerder gereserveerd heeft krijgt een kamer aaneengesloten, de persoon die later is kan je aangeven dat hij dan moet verkassen van kamer dat probleem los je echt niet op door de kamernummers wel te weten...tenslotte weet je zelfs met kamernummers in jou voorbeeld al dat iemand moet verkassen ;)

Toevoeging op 18/12/2012 13:25:14:

Je zou trouwens ook gewoon de eerstvolgende vrije kamer invullen en die later wijzigen als je dat dan toch zo perse nodig vind...dan weet je altijd een kamer...iemand die niet specifiek een kamer reserveerd maakt het toch niet uit.
 
Lars Anderson

Lars Anderson

18/12/2012 13:29:03
Quote Anchor link
Erwin H op 18/12/2012 13:13:20:

Lars Anderson op 18/12/2012 13:10:13:
Ik ben inderdaad bang dat ik zoals Erwin al zei (Erwin H 18/12/2012 12:30:27) dat ik per dag van de datum range die ik wil controleren zal moeten gaan kijken of er nog kamers beschikbaar zijn op die dag. Of heeft er iemand nog een betere oplossing waarmee dit met één query zou kunnen?

Dit kan al met 1 query.



Hoe? Kun je daar wellicht een voorbeeld van geven?
 
No One

No One

18/12/2012 13:32:45
Quote Anchor link
Met deze query kun je alle datums selecteren. vandaar uit kun je een query omheen bouwen die elke datum checkt op het aantal kamers
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<? select a.Date, (query met a.Date er in) as kamers_vrij
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2010-01-20' and '2010-01-24' ?>
 
Lars Anderson

Lars Anderson

18/12/2012 14:32:19
Quote Anchor link
Bah, ik kom er nog steeds niets uit. Wat ik ook probeer. Ik krijg geen resultaten.
Dit is wat ik doe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
SELECT a.Date, (SELECT count(*)
FROM reservations
WHERE `reservation_end` > a.Date
AND `reservation_start` < a.Date
GROUP BY room_type_id
) as kamers_bezet
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY as Date
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
) a
where a.Date between '2012-12-20' and '2012-12-25'
?>



Wat ik hier nu uit zou willen krijgen is een lijstje dat er als volgt uit ziet:

a.Date: Kamers bezet:
2012-12-20 0
2012-12-21 1
2012-12-22 1
2012-12-23 1
2012-12-24 0

Wat doe ik fout?
 
No One

No One

18/12/2012 15:08:22
Quote Anchor link
De where clause zoekt naar reserveringen tussen 2012-12-20 en 2012-12-20...

denk dat je die where clause iets moet maken where a.Date between reservation_start and reservation_end.
Gewijzigd op 18/12/2012 15:09:20 door No One
 
Erwin H

Erwin H

18/12/2012 16:30:45
Quote Anchor link
Lars Anderson op 18/12/2012 13:29:03:
Hoe? Kun je daar wellicht een voorbeeld van geven?

Het 'put your money where your mouth is' principe. En ik kan je geen ongelijk geven, want waar ik eerst dacht 'dat doe je even zo', bleek het toch wat lastiger.

Maar, zonder overigens geprobeerd te hebben de query van Henze aan de praat te krijgen, heb ik wel iets wat in mijn kleine test omgevinkje werkte. Per stap uitleg:

1) als eerste heb je nodig een rij van data waarover je wil controleren hoeveel reserveringen er zijn. Ik ken iemand die een tabel bijhoudt met alle dagen van nu en in de toekomst erin.... dat ben ik echter niet van plan. Dus hier een 'on-the-fly' oplossing (met een addertje):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SET @num = -1;
SELECT DATE_ADD( '2013-01-01', interval @num := @num+1 day) AS date_sequence
FROM numbers
HAVING DATE_ADD('2013-01-01', interval @num day) <= '2013-01-14'

De data kan je zelf invullen, '2013-01-01' en '2013-01-14' waren mijn testwaardes.
Het addertje is in de FROM clause, die tabel 'numbers'. Deze query kan je niet draaien zonder echte tabel en ook niet zonder een tabel met genoeg rijen erin! Numbers is dus een bestaande tabel bij mij, die ook een aantal rijen heeft. Maakt niet uit wat erin staat, als er maar iets bestaat. In mijn geval heeft die tabel 1 kolom, met 100 rijen met alleen 0. Dit heb je nodig, want bovenstaande loopt alle rijen van de geselecteerde tabel af en creeert tijdens die query de data die je nodig hebt. Heb je dus te weinig rijen in de tabel staan, dan krijg je ook te weinig dagen!!

2) link bovenstaande aan de tabel met reserveringen
Hier komt ook een alternatieve methode om de hoek kijken. Bij de join die je maakt wil je eigenlijk de reserveringen dupliceren voor alle dagen van de reservering, zodat je makkelijk kunt tellen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT a.id, b.date_sequence
FROM booking a
INNER JOIN (
  SELECT DATE_ADD( '2013-01-01', interval @num := @num+1 day) AS date_sequence
  FROM numbers
  HAVING DATE_ADD('2013-01-01', interval @num day) <= '2013-01-14'
) b ON (
  a.aankomst <= b.date_sequence
  AND vertrek > b.date_sequence
)

Zoals je ziet zijn de voorwaarden voor de join niet de gebruikelijke gelijkheden, maar ongelijkheden. Zo worden de reserveringen gekoppeld aan elke dag in de reservering, niet alleen aan de aankomst en/of vertrekdag.

3) tellen
Het makkelijke deel :-)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SET @num = -1;
SELECT count(a.id), b.date_sequence
FROM booking a
INNER JOIN (
  SELECT DATE_ADD( '2013-01-01', interval @num := @num+1 day) AS date_sequence
  FROM numbers
  HAVING DATE_ADD('2013-01-01', interval @num day) <= '2013-01-14'
) b ON (
  a.aankomst <= b.date_sequence
  AND vertrek > b.date_sequence
)
GROUP BY b.date_sequence;


Ik hoop dat het duidelijk is, dat het werkt en ook dat het niet al te langzaam is. Het werkte dus in de testomgeving, maar die is te klein om echte performance to kunnen checken.
Gewijzigd op 18/12/2012 16:32:06 door Erwin H
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/12/2012 16:37:20
Quote Anchor link
Henze, ik vraag me af of jij überhaupt een rijtje datums uit die query krijgt.
En dan zonder de queries eromheen.
Een andere optie is om simpelweg een tabelletje te maken met de datums voor de aankomende jaren en daarop te joinen bv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
     d.adate,
    COUNT(r.id) AS rooms_reserved
FROM
    (SELECT adate FROM date_table
    WHERE adate BETWEEN '2012-12-19' AND '2012-12-24') d
LEFT JOIN
    (SELECT id, reservation_start rs, reservation_end re
    FROM reservations
    WHERE room_type = 'A' AND reservation_end >= CURRENT_DATE()) r
    ON r.rs <= d.adate AND r.re > d.adate
GROUP BY d.adate

Probleem blijft bestaan dat als er in die periode 2x een verschillende specifieke kamer is gereserveerd je dat niet kunt achterhalen.


Toevoeging op 18/12/2012 16:49:14:

@Erwin, ik ken die persoon toevallig ook!
Gewijzigd op 18/12/2012 16:40:39 door Ger van Steenderen
 
Erwin H

Erwin H

18/12/2012 16:54:05
Quote Anchor link
Ger van Steenderen op 18/12/2012 16:37:20:
@Erwin, ik ken die persoon toevallig ook!

:-)
Nu wil ik niet zeggen dat dat een slechte oplossing is, het is gewoon niet de mijne. Helaas heb ik het nu alsnog moeten doen met een extra (verder nutteloze) tabel, dus ik blijf nog wel even kijken naar een oplossing zonder verdere externe hulpmiddelen.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

18/12/2012 17:09:47
Quote Anchor link
Het punt is dat je anders telkens een tempory table moet gaan maken en daarin de datums te inserten .
Normaal gesproken ben ik ook geen voorstander van zo'n nutteloze tabel, maar of het één er met datums is of met nummers maakt ook niet zoveel uit. Overigens kan jou stukje subquery iets makkelijker:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
SELECT
    @startdate := @startdate + INTERVAL 1 DAY AS datum
FROM
    numbers,
    (SELECT @startdate := '2012-12-17') uvar
HAVING @startdate <= '2012-12-24'
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.