Beste leden,

Graag zou ik de resultaten van vandaag en de rest van de maand willen tonen.

SELECT event_id, datetime
FROM sportevenementen
WHERE MONTH(datetime) = MONTH(NOW()) ORDER BY `datetime` ASC

Met de query hierboven krijg ik alle resultaten van de maand.

Graag zou ik de resultaten van vandaag 8 oktober en de rest van de maand willen zien.
Volgens mij gebruik ik daarvoor de CURDATE, maar weet ik niet hoe ik deze kan toepassen in de query.

Heeft iemand een idee, hoe ik dit zou kunnen aanpassen?

Met vriendelijke groet,

Levy van der Meijden
Bedankt, ja nu is het tot 31 oktober.

Volgens mij kan je dit het beste doen met BETWEEN, maar ik weet niet hoe.

Was het ook (niet) zo dat zodra je dit soort kolomdata aan functies gaat voeren dat dan het hele proces voor optimalisatie (bijvoorbeeld door gebruikmaking van indexen) compleet om zeep is omdat deze resultaten allemaal uitgerekend moeten worden om te kijken of ze voldoen? Tenzij je wellicht een function based index aanmaakt op deze kolom, maar volgens mij kan het allemaal veel simpeler: wat ik zou doen is dingen in PHP uitrekenen (begin- en einddatum) en gewoon aan de query voeren en uitvoeren met behulp van een BETWEEN-statement. Veel simpeler wordt het niet?

Verdeel en heers.

(en misschien ff een index aanmaken op de datumtijd kolom)

<?php
$dt = new DateTime();

$today = $dt->format('Y-m-d');
$lastDayOfMonth = $dt->format('Y-m-t');

echo 'today: '.$today.', last day of month: '.$lastDayOfMonth;
?>
Levy van der Meijden op 08/10/2019 22:43:00

Bedankt, ja nu is het tot 31 oktober.

Volgens mij kan je dit het beste doen met BETWEEN, maar ik weet niet hoe.



Dat zei ik al in m'n eerste POST. Zie ook BETWEEN
Maar ook die geeft niet de laatste datum weer.

$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM
    sportevenementen
WHERE
    datumtijd
	BETWEEN '2019-10-08'
		AND
    	LAST_DAY('2019-10-08')
ORDER BY
    datumtijd ASC");


[size=xsmall]Toevoeging op 08/10/2019 23:01:17:[/size]

@Thomas, waarom zou je eerst iets UIT je database halen om dit vervolgens weer te gebruiken IN je database? Omslachtig als je het mij vraagt. Het is vreemd dat het niet zo werkt als je verwacht.
Ander alternatief voor je code:
<?php
echo (new \DateTime('last day of this month'))->format("Y-m-d");
?>
Uhh, waar haal je iets (eerst) uit je database dan? Ik stel dit nergens voor? Topicstarter vraagt volgens mij om alles vanaf [vandaag] tot [het einde van de maand]. Lijkt me redelijk generiek en losstaand van wat er al dan niet in de database zit?

Ik vind het niet omslachtig om iets eenvoudig in PHP uit te rekenen en MySQL hapklare brokken te voeren waarbij gelijk van een aanwezige indexering gebruik gemaakt kan worden, maar to each his own I guess.

EDIT: vraag is dus hoe netjes LAST_DAY zich gedraagt. Maakt deze dan nog steeds gebruik van een mogelijke index? Hoe ziet de query er met een EXPLAIN uit? En hoe efficiënt is/blijft deze query (en aanverwante queries en functionaliteit) als de database (flink) groeit?
We verschillen vaker van mening, geeft ook niks ;-)
Maar in een SELECT gebruik ik liever LAST_DAY(NOW()) dan (new \DateTime('last day of this month'))->format("Y-m-d")
Ze doen precies het zelfde.

[size=xsmall]Toevoeging op 08/10/2019 23:11:18:[/size]

Thomas van den Heuvel op 08/10/2019 23:06:12

EDIT: vraag is dus hoe netjes LAST_DAY zich gedraagt. Maakt deze dan nog steeds gebruik van een mogelijke index? Hoe ziet de query er met een EXPLAIN uit? En hoe efficiënt is/blijft deze query (en aanverwante queries en functionaliteit) als de database (flink) groeit?

Ho, wacht. LAST_DAY zoekt niet in de database. Dit is gewoon een functie van MySQL die de laatste dag van die maand serveert. Nou snap ik ook waarom je over index begint.
EDIT: Je vergelijkt het nu met MAX()
Zie ook LAST_DAY
Ok, maar er zijn nog andere argumenten om dit vanuit PHP aan te sturen. In jouw opzet heb je in wezen een hard coded interval. Stel dat je straks verschillende intervallen wilt kunnen instellen ("de komende twee weken", "een week terug tot een week in de toekomst", of zelfs het vrij selecteren van twee data etc). In jouw opzet zul je dan of je query generieker moeten maken of hier allemaal aparte queries voor moeten opstellen, dat is niet erg flexibel.

Het lijkt mij gewoon in zijn algemeenheid beter als het meeste "denkwerk" al is gedaan en je de vragen die je MySQL stelt zo simpel (en generiek) mogelijk houdt.

Als dit alles statische code is voor een soort monolithisch script voor een rapportage ofzo, dan soit. Maar anders mag je best nadenken over hergebruik of mogelijke uitbreiding. Lijkt me niet dat je je dan op voorhand "vastprogrammeert" door queries te schrijven die echt maar geschikt zijn om één specifiek ding te doen.

Elke mogelijke verandering in de functionaliteit met jouw aanpak zal waarschijnlijk resulteren in een query-wijziging. Die dan weer getest moet worden etc etc. Keep it simple?
Bedankt voor het geven van meerdere mogelijkheden en wat de voor en nadelen hiervan zijn.

Maar hoe koppel ik de PHP code samen met een query?


De rauwe datum uit door MySQL laten uitpoepen, en die datum op de juiste manier formatteren, zoals Thomas laat zien.
Het argument in mysqli_query() dat de SQL-code bevat is gewoon een string, dus deze kun je met behulp van PHP opbouwen.
<?php
$dt = new DateTime();

// these dates can be... anything really
$intervalStart = $dt->format('Y-m-d'); // today
$intervalEnd = $dt->format('Y-m-t'); // end of month

$sql =
    "SELECT event_id, datumtijd
    FROM sportevenementen
    WHERE datumtijd BETWEEN '".$intervalStart."' AND '".$intervalEnd."'
    ORDER BY datumtijd ASC";

echo $sql; // feed $sql to mysqli_query()
?>

EDIT: het is hierbij wel heel belangrijk dat de DATA die je invoegt niet op zijn beurt geïnterpreteerd wordt als SQL, want daarmee zou je dan dus de werking van de query aan kunnen passen en data uit de database kunnen vissen die helemaal niet blootgesteld mag worden. Daarom is het eigenlijk zaak dat je alle DATA-delen in een query ontdoet van de mogelijke speciale (SQL-gerelateerde) betekenis. Dit doe je met behulp van de real_escape_string() functie in combinatie met quotes (het een is niet veilig zonder het ander). Maar dit is eigenlijk een compleet ander onderwerp maar ik zet het hier nogmaals als disclaimer neer :p.
@Thomas, Als je meerdere variaties van queries wilt uitvoeren moet dit sowieso in PHP ja, maar dit was niet de vraag van de TS. De TS wil van nu tot laatste dag van de maand. Laten we daar dan een oplossing voor geven. En niet nu al na denken over de plek waar mogelijk ooit in de toekomst een zwembad moet komen terwijl het huis nog gebouwd moet worden. In dit geval zou het met een BETWEEN en LAST_DAY zijn opgelost, als SQL niet vertikt om het laatste resultaat niet te laten zien. Dit los je niet met die PHP DateTime op.

Reageren