Dag en maand

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

08/10/2019 19:22:19
Quote Anchor link
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
 
PHP hulp

PHP hulp

20/04/2024 00:57:33
 
Bart V B

Bart V B

08/10/2019 19:31:39
Quote Anchor link
Volgens mij is datetime een gereserveerd woord.
https://dev.mysql.com/doc/refman/8.0/en/keywords.html#keywords-8-0-detailed-D
Ik zou dat eens eerst aanpassen.
 
Michael -

Michael -

08/10/2019 19:34:37
Quote Anchor link
datetime kun je inderdaad niet als veldnaam gebruiken.

Het zou iets zijn als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT *
FROM tabel
WHERE datum BETWEEN NOW()
    AND LAST_DAY(NOW())


LAST_DAY()
Gewijzigd op 08/10/2019 19:36:40 door Michael -
 

08/10/2019 19:37:30
Quote Anchor link
Bedankt voor de reacties,

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.
 
Michael -

Michael -

08/10/2019 20:22:18
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");

LAST_DAY('2019-10-08') wordt dan automatisch 2019-10-31
Gewijzigd op 08/10/2019 20:36:33 door Michael -
 

08/10/2019 21:10:23
Quote Anchor link
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.
Gewijzigd op 08/10/2019 21:17:32 door
 
Michael -

Michael -

08/10/2019 21:23:19
Quote Anchor link
Ik kan het niet uitproberen maar misschien helpt het je in de goede richting
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");

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)
 

08/10/2019 21:27:54
Quote Anchor link
Bedankt, de resultaten zijn tot en met 2019-10-30.

Maar ik ga dit proberen:
LAST_DAY(NOW()) kan ook als LAST_DAY(CURDATE()) of LAST_DAY(CURDATE() + INTERVAL 1 MONTH)
 
Michael -

Michael -

08/10/2019 21:40:42
Quote Anchor link
Gebruik je wel <= ? (Minder dan en gelijk aan)
Nu gebruik je ook de > (Meer dan). Dit zou ook de datum van morgen pakken waarschijnlijk.
 

08/10/2019 21:46:43
Quote Anchor link
Nee, de datum blijft tot 2019-10-30.

$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");
 
Michael -

Michael -

08/10/2019 22:30:27
Quote Anchor link
Ik heb het gereproduceerd en ik krijg inderdaad ook niet de laatste dag.
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)
PHP script in nieuw venster Selecteer het PHP script
1
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");

Erg fraai is dit niet.
 

08/10/2019 22:43:00
Quote Anchor link
Bedankt, ja nu is het tot 31 oktober.

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

Thomas van den Heuvel

08/10/2019 22:51:29
Quote Anchor link
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)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>
Gewijzigd op 08/10/2019 22:57:27 door Thomas van den Heuvel
 
Michael -

Michael -

08/10/2019 22:59:12
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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");


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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo (new \DateTime('last day of this month'))->format("Y-m-d");
?>
Gewijzigd op 08/10/2019 23:04:07 door Michael -
 
Thomas van den Heuvel

Thomas van den Heuvel

08/10/2019 23:06:12
Quote Anchor link
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?
Gewijzigd op 08/10/2019 23:11:05 door Thomas van den Heuvel
 
Michael -

Michael -

08/10/2019 23:09:13
Quote Anchor link
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.

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 -
 
Thomas van den Heuvel

Thomas van den Heuvel

08/10/2019 23:20:08
Quote Anchor link
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?
Gewijzigd op 08/10/2019 23:31:50 door Thomas van den Heuvel
 

08/10/2019 23:23:41
Quote Anchor link
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?
 
- Ariën  -
Beheerder

- Ariën -

08/10/2019 23:29:23
Quote Anchor link
De rauwe datum uit door MySQL laten uitpoepen, en die datum op de juiste manier formatteren, zoals Thomas laat zien.
 
Thomas van den Heuvel

Thomas van den Heuvel

08/10/2019 23:29:44
Quote Anchor link
Het argument in mysqli_query() dat de SQL-code bevat is gewoon een string, dus deze kun je met behulp van PHP opbouwen.
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
$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
 
Michael -

Michael -

08/10/2019 23:34:01
Quote Anchor link
@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.
Gewijzigd op 08/10/2019 23:35:11 door Michael -
 

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.