Date range test

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Junior Fullstack Developer

Functie omschrijving Heb jij je universitair diploma Informatica afgerond en ben jij op zoek naar een startersfunctie waar jouw ontwikkeling in een hoog vaandel staat? Voor een softwarebedrijf in Amsterdam zijn wij op zoek naar een Junior Fullstack Developer. Je begint met een op maat gemaakte training om de kennis bij te spijkeren die jij nog mist. Uiteraard leer je het meeste tijdens je werk, maar de training geeft je hiervoor alvast de juiste handvatten. Je kunt het volgende verwachten! Jij ontwikkelt in technieken als Java, Javascript en SQL. Je werkt hierbij volgens de Agile/Scrum methode; Na het afronden van

Bekijk vacature »

Front-end Developer - Juniorfunctie

Functie omschrijving Ben jij op zoek naar een uitdagende baan als front-end developer, in een informele werksfeer, waar jij echt het verschil kan maken? Wil jij graag werken voor een bedrijf dat sportiviteit en een open communicatie, hoog in het vaandel heeft staan? Dan hebben wij de perfecte vacature voor je! Voor een klein bedrijf in Rijen dat gespecialiseerd is in het omzetten van digitale woningtekeningen naar managementinformatie, zijn wij per direct op zoek naar een allround front-end developer. Jouw werkzaamheden zien er als volgt uit: Ja gaat nauw samenwerken met de back-end developer. De database structuur is volledig gebouwd

Bekijk vacature »

Mendix Developer

Functie Wat ga je doen als Mendix Developer? We leven in een wereld die snel ontwikkelt en veranderd, ook nemen bedrijfsbelangen toe en blijken risico’s moeilijker in te schatten, daarom wij op zoek naar Junior, Medior en Senior Developers die bedrijven kunnen helpen met hun screeningproces en zorgen dat deze efficiënt en 100 procent AVG compliant is. Het concept achter Mendix is duidelijk. De klant heeft een vraag/probleem. Dit kunnen we door middel van slimme software oplossen. In plaats van te werken met de nieuwste technieken en tools, wordt er gekozen voor het implementeren en maken van software dat op

Bekijk vacature »

Medior C# Developer

Samen met het development team zorg je ervoor dat alle systemen achter de schermen vlekkeloos werken. Wat doe je als Medior C# Developer bij Coolblue? Als C# developer doe je regelmatig mee aan brainstormsessies over user experience, data en task flow met de UX Designer, Product Owner en Data Scientist in je team. Daarnaast schrijf je op zichzelf staande, consistente en testbare code die goed onderhoudbaar en toekomstbestendig is. Ook C# Developer worden bij Coolblue? Lees hieronder of het bij je past. Dit vind je leuk om te doen Werken met verschillende soorten data-opslag, zoals Oracle of AWS. Problemen oplossen

Bekijk vacature »

Functioneel applicatiebeheerder - SOP-SYS-SAM

TenneT is hard groeiend om de onze ambities waar te kunnen maken. Zo nemen wij een leidende rol in het aanjagen van de energietransitie. Het werven van nieuw talent speelt daarin een cruciale rol. Wij zijn op zoek naar een gedreven Functioneel Applicatiebeheerder voor het financiele domein op onze locatie Arnhem die hieraan wil bijdragen en misschien ben jij dat wel? Jouw bijdrage aan TenneT Je gaat samenwerken in een team van circa 15 functioneel applicatiebeheerders en gaat onderdeel uitmaken van een DevOps team. Met dit team ga je applicaties (laten) ontwikkelen en beheren. Hierbij concentreer je je vooral op

Bekijk vacature »

Low Code Ontwikkelaar

In het kort Als Low Code Developer werk je aan projecten bij en voor onze klanten, waarbij je voor het ontwikkelen van de oplossingen een technisch low-code platform gebruikt. Samen met het team streef je naar de beste oplossing en bepalen jullie de juiste aanpak. Je rol is divers en je bent van begin tot eind betrokken bij de ontwikkeling zowel de back-end en de front-end van de applicatie. Naast de ontwikkeling en oplevering, breng je ook advies uit aan de klant waarom bepaalde keuzes worden gemaakt. Je bent dan ook communicatief sterk en kunt je keuzes goed (inhoudelijk) onderbouwen.

Bekijk vacature »

.NET Developer Medior Senior

Dit ga je doen Ontwikkelprocessen verder optimaliseren en verder ontwikkelen met C#; CI/CD-pipelines automatiseren; Herbruikbare componenten maken; Testen; Front-end pagina's gebruiksvriendelijk maken. Hier ga je werken Als .NET Developer kom jij terecht binnen een grote en internationale organisatie. Zij streven naar een positieve impact op de mens, milieu en maatschappij. Het bedrijf is oorspronkelijk een familiebedrijf en werkt aan de productie van hoogwaardige en technische systemen voor de gezondheidszorg. Momenteel willen zij betere ontwikkelprocessen creëren op internationaal gebied en staat kwaliteit en veiligheid voor hun op nummer 1! Als .NET Developer werk jij aan het ontwikkelen van verbeterde software voor

Bekijk vacature »

Medior/senior PHP ontwikkelaar E-commerce

Functie Het software development team bestaat momenteel 5 scrum teams . Ieder team heeft een eigen SCRUM Master en eigen tester. Zij werken voornamelijk in PHP en met hun eigen geschreven framework wat Symfony based is . Jij bent samen met je collega’s verantwoordelijk voor het interne softwaresysteem en alle projecten die daar omheen lopen. Alles wat jij ontwikkelt, wordt direct toegepast en uitgerold (wereldwijd). Dit maakt jouw werk tastbaar en uitdagend! Een greep uit jouw werkzaamheden: Toevoegen en ontwikkelen van nieuwe functionaliteiten Logistieke software ontwikkelen voor intern gebruik Tientallen gigabytes aan data inzichtelijk maken Altijd op zoek gaan naar

Bekijk vacature »

Developer Angular & Kotlin

Dit ga je doen Het (door)ontwikkelen van mobiele apps en webapplicaties; Het opstellen van technisch ontwerp en het bespreken van ontwerpen met de software architect; Het uitvoeren van werkzaamheden op het gebied van technisch testen; Het in de gaten houden van nieuwe ontwikkelingen op jouw vakgebied en het adviseren van de organisatie hierover. Hier ga je werken Het gaat om een bekend internationaal handelsbedrijf met ruim 800 medewerkers, verdeeld over verschillende deelbedrijven. Deze organisatie is van oorsprong een familiebedrijf, er wordt hard gewerkt, er heerst een no nonsense en doeners mentaliteit, een informele sfeer en er is een mix van

Bekijk vacature »

Low-code developer

Functie omschrijving Heb jij altijd al een training willen volgen in het buitenland? Voor een leuke opdrachtgever in omgeving Alphen ad Rijn zijn wij op zoek naar kandidaten die aan de slag willen als Low Code Developer! Beschik jij over HBO/WO nivo, bij voorkeur Informatica, maar een ander technische opleiding zoals bijv. wiskunde, natuurkunde is ook goed. Heb jij aantoonbare affiniteit met IT en ben jij gedreven, enthousiast, communicatief vaardig en klantgericht? Lees dan snel verder! Je wordt getraind tot een volwaardig Low Code Developer, het traject ziet er als volgt uit: Start 1e week januari, opleiding van 3 weken

Bekijk vacature »

Low Code Developer voor o.a. overheidsprojecten!

Bedrijfsomschrijving Wil jij ook behoren tot de specialist in Low Code? Dan zou ik zeker aanraden om verder te lezen. Deze organisatie is ooit opgericht door twee studenten en is inmiddels uitgegroeid tot een serieuze werkgever met een groot aanzien op Low Code projecten. De sfeer is echter niet veranderd, er heerst een informele sfeer met een open deuren beleid, en hierin mag de eigen bar natuurlijk niet ontbreken. Momenteel maakt deze organisatie een flinke groei door en hier kan jij natuurlijk niet bij ontbreken. Daarom ben ik op zoek naar Low Code Developers met een degelijke technische achtergrond. Kennis

Bekijk vacature »

Software Developer C++ en Perl

Ben je een slimme en enthousiaste universitair opgeleide bèta die graag bij een relatief klein softwarebedrijf wil werken waar de sfeer goed is en eigen inbreng gewaardeerd wordt? Wij, IntelliMagic in Leiden, ontwikkelen technisch hoogwaardige software op het gebied van IT infrastructuur performance analytics. Het type software zorgt voor intellectueel interessante uitdagingen. We ontwerpen de producten zelf en verkopen deze als off-the-shelf software aan grote bedrijven in Europa en de VS. Wij zoeken een ervaren C++ software engineer met kennis van Perl voor een van onze ontwikkelteams. Werkzaamheden Samen met de andere ontwikkelaars specificeren, ontwerpen en implementeren van nieuwe functionaliteit

Bekijk vacature »

Medior front-end developer gezocht (€3.300 -

Functie Wat ga je doen? Jij als front-end developer gaat werken binnen de teams van/voor onze klant. Je werkt in een team met starters en ervaren ontwikkelaars met allemaal 1 overeenkomst; passie voor het vak. Maak je een fout? Geen probleem, leer ervan en ga dan weer door. Door de variëteit aan werk kun je in verschillende omgevingen een kijkje nemen en jezelf dus snel ontwikkelen. Wat hebben we jou te bieden? • Uitdagende projecten bij mooie klanten (bij jou in de buurt, of binnenkort intern vanuit ons kantoor!) • Een jonge organisatie met talentvolle collega’s • Veel ruimte voor

Bekijk vacature »

Full stack .NET developer Microsoft 365

Wat ga je doen als Full stack .NET developer Microsoft 365? Je stelt je op als sparringpartner voor het team en PO over toekomstige functionaliteiten, architectuur en mogelijke nieuwe producten. Je bent mede-verantwoordelijk voor het vertalen en omzetten van een user story in een passend technisch design. Je implementeert functionaliteiten op basis van een technisch design en user story. Je bent mede-verantwoordelijk voor het beheer van Azure DevOps, waaronder het beheer van GIT, Build Pipelines, Release Pipelines en geautomatiseerde testen. Hier herken jij jezelf in Hbo werk- en denkniveau of hoger aangevuld met relevante certificeringen en/of cursussen; Minimaal 3 jaar

Bekijk vacature »

Oracle APEX Ontwikkelaar (3.500-6.000 euro)

Bedrijfsomschrijving Ben jij een getalenteerde Oracle APEX ontwikkelaar met minimaal één jaar ervaring in het ontwikkelen van Oracle APEX-applicaties? Ben je gepassioneerd over het ontwikkelen van bedrijfskritische oplossingen en wil je werken bij een toonaangevend consultancybedrijf? Dan zijn wij op zoek naar jou! Deze organisatie beschikt over zowel inhouse als externe projecten, maar bovenal over een sterk team en netwerk van opdrachten waardoor jij jezelf verder kunt ontwikkelen. Het team bestaat uit een aantal junior en medior developers, maar vooral uit senioren. De business unit managers binnen het team zijn mensen die hun vak verstaan en zelf als Oracle APEX

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

09/05/2024 00:43:59
 
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.