Dag en maand
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
https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-D
Ik zou dat eens eerst aanpassen.
Oke, dan verander ik de veldnaam.
Ik ga de sql query code proberen.
Toevoeging op 08/10/2019 19:51:38:
$result = mysqli_query($con,"SELECT event_id, datum
FROM sportevenementen
WHERE datum between '2019-10-08' and '2019-10-31' ORDER BY `datetime` ASC");
Dit is wel gelukt, nog even vigileren.
Code (php)
1
2
3
2
3
$result = mysqli_query($con,"SELECT event_id, datum
FROM sportevenementen
WHERE datum BETWEEN '2019-10-08' AND LAST_DAY('2019-10-08') ORDER BY datum ASC");
FROM sportevenementen
WHERE datum BETWEEN '2019-10-08' AND LAST_DAY('2019-10-08') ORDER BY datum ASC");
LAST_DAY('2019-10-08') wordt dan automatisch 2019-10-31
Gewijzigd op 08/10/2019 20:36:33 door Michael -
Toevoeging op 08/10/2019 21:12:32:
$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM sportevenementen
WHERE datumtijd > date_sub(CURRENT_DATE(), interval 0 week) order by datumtijd ASC");
Nu heb ik de begindatum goed, maar de laatste dag van de maand nog niet.
$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM sportevenementen
WHERE datumtijd > date_sub(CURRENT_DATE(), interval 0 week) order by datumtijd ASC");
Nu heb ik de begindatum goed, maar de laatste dag van de maand nog niet.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM
sportevenementen
WHERE
datumtijd > date_sub(CURRENT_DATE(), interval 0 week)
AND
datumtijd <= LAST_DAY(NOW())
ORDER BY
datumtijd ASC");
FROM
sportevenementen
WHERE
datumtijd > date_sub(CURRENT_DATE(), interval 0 week)
AND
datumtijd <= LAST_DAY(NOW())
ORDER BY
datumtijd ASC");
Als je toch geen interval gebruikt kun je ook gewoon NOW() gebruiken.
LAST_DAY(NOW()) kan ook als LAST_DAY(CURDATE()) of LAST_DAY(CURDATE() + INTERVAL 1 MONTH)
Maar ik ga dit proberen:
LAST_DAY(NOW()) kan ook als LAST_DAY(CURDATE()) of LAST_DAY(CURDATE() + INTERVAL 1 MONTH)
Nu gebruik je ook de > (Meer dan). Dit zou ook de datum van morgen pakken waarschijnlijk.
$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM sportevenementen
WHERE datumtijd >= date_sub(CURRENT_DATE(), interval 0 week) AND datumtijd <= LAST_DAY(NOW()) order by datumtijd ASC");
Met < en met <= krijg ik het zelfde resultaat. Heel vreemd. Misschien is er iemand hier die dat kan uitleggen.
Een workaround is om er een dag bij op te tellen
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
$result = mysqli_query($con,"SELECT event_id, datumtijd
FROM
sportevenementen
WHERE
datumtijd > '2019-10-08'
AND
datumtijd < DATE_ADD(LAST_DAY('2019-10-08'), INTERVAL + 1 DAY)
ORDER BY
datumtijd ASC");
FROM
sportevenementen
WHERE
datumtijd > '2019-10-08'
AND
datumtijd < DATE_ADD(LAST_DAY('2019-10-08'), INTERVAL + 1 DAY)
ORDER BY
datumtijd ASC");
Erg fraai is dit niet.
Volgens mij kan je dit het beste doen met BETWEEN, maar ik weet niet hoe.
Verdeel en heers.
(en misschien ff een index aanmaken op de datumtijd kolom)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$dt = new DateTime();
$today = $dt->format('Y-m-d');
$lastDayOfMonth = $dt->format('Y-m-t');
echo 'today: '.$today.', last day of month: '.$lastDayOfMonth;
?>
$dt = new DateTime();
$today = $dt->format('Y-m-d');
$lastDayOfMonth = $dt->format('Y-m-t');
echo 'today: '.$today.', last day of month: '.$lastDayOfMonth;
?>
Gewijzigd op 08/10/2019 22:57:27 door Thomas van den Heuvel
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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
$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");
FROM
sportevenementen
WHERE
datumtijd
BETWEEN '2019-10-08'
AND
LAST_DAY('2019-10-08')
ORDER BY
datumtijd ASC");
Toevoeging op 08/10/2019 23:01:17:
@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:
Gewijzigd op 08/10/2019 23:04:07 door Michael -
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?
Gewijzigd op 08/10/2019 23:11:05 door Thomas van den Heuvel
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.
Toevoeging op 08/10/2019 23:11:18:
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
Gewijzigd op 08/10/2019 23:12:46 door Michael -
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?
Gewijzigd op 08/10/2019 23:31:50 door Thomas van den Heuvel
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?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()
?>
$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.
Gewijzigd op 08/10/2019 23:35:34 door Thomas van den Heuvel
Gewijzigd op 08/10/2019 23:35:11 door Michael -