Hallo allemaal, ik probeer met onderstaande code een field terug te krijgen.


$trainToday = date("d-m-Y");
$trainEndDate = date('d-m-Y', strtotime($trainToday. ' + 12 weeks'));	// or 4 days i.e.
$trainingTeamLid = "X12-1";

$sqltrainingLidDates = "SELECT datum FROM celeritas_aanwezigheid WHERE (datum BETWEEN '$trainToday' AND '$trainEndDate') AND team = '$trainingTeamLid' ORDER BY STR_TO_DATE(datum, '%d-%m-%Y') ASC LIMIT 8";
		$resulttrainingLidDates = $db->query($sqltrainingLidDates);



datum in tabel:

07-04-2022
14-04-2022
21-04-2022
05-05-2022
19-05-2022
21-05-2022



datum veld staat op varchar (express omdat het eventueel ook ander formaat en tekst zou kunnen zijn.
en ook in notatie dd-mm-yyyy
Graag ontvang ik geen commentaar op waarom ik het op varchar heb staan en een ander format dan yyyy-mm-dd
maar alleen hulp hoe ik toch alles tussen vandaag en 12 week verder met een limiet van 8 records kan krijgen.

Nu heb ik een empty result (getest in phpmyadmin)

[size=xsmall]Toevoeging op 30/04/2022 12:34:25:[/size]

stel ik voer de volgende regel uit:

SELECT datum FROM celeritas_aanwezigheid WHERE (datum BETWEEN '01-01-2022' AND '22-04-2022') AND team = 'X12-1' ORDER BY STR_TO_DATE(datum, '%d-%m-%Y') ASC LIMIT 8


dan is mijn resultaat:

07-04-2022
14-04-2022
21-04-2022
05-05-2022
19-05-2022


Dit omdat team hier X12-1 is, hij zoekt dus niet op datum..
Christiaan de kleine op 30/04/2022 12:30:41


datum veld staat op varchar (express omdat het eventueel ook ander formaat en tekst zou kunnen zijn.
en ook in notatie dd-mm-yyyy
Graag ontvang ik geen commentaar op waarom ik het op varchar heb staan en een ander format dan yyyy-mm-dd
maar alleen hulp hoe ik toch alles tussen vandaag en 12 week verder met een limiet van 8 records kan krijgen.

Maar waarom zou je dat dan niet aanpassen? Waarom zou je de moeilijke weg willen bewandelen in plaats van de makkelijke weg met standaard functies.
Het kan wel, maar door je opzet wordt het een stuk ingewikkelder.


SELECT datum
FROM celeritas_aanwezigheid
WHERE STR_TO_DATE(datum, '%d-%m-%Y') BETWEEN '2022-01-01' AND '2022-04-22'
AND team = 'X12-1'
ORDER BY STR_TO_DATE(datum, '%d-%m-%Y') ASC 
LIMIT 8


Tip: sla dingen als datums altijd op in het format waarmee je DB het makkelijkst om kan gaan. Het formatteren van datums naar alle mogelijke variaties/talen kan door zowel je DB als PHP heel makkelijk gedaan worden.
test table gemaakt, met date als date en 3 rijen

SELECT DATE_FORMAT(date, \"%d-%m-%Y\") AS formatted_date FROM test WHERE date >= NOW() ORDER BY formatted_date ASC LIMIT 8

2022-04-30
2022-05-01
2022-04-15

als ik bovenstaande code run, krijg ik maar 1 record te zien ipv 2...

heb namelijk voor mijn output toch echt dd-mm-yyyy nodig, dus vandaar die verplichte DATE_FORMAT(date, \"%d-%m-%Y\") AS formatted_date
Voor wie het wil proberen.

DROP TABLE IF EXISTS celeste;
CREATE TABLE celeste (
	id int(11) NOT NULL AUTO_INCREMENT,
	datum date NOT NULL,
	PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO celeste (id, datum) VALUES
(1,	'2022-05-03'),
(2,	'2022-04-30'),
(3,	'2022-05-01'),
(4,	'2022-04-15'),
(5,	'2022-06-02');

SELECT id, datum FROM celeste;

SELECT id, datum FROM celeste WHERE datum >= NOW();

SELECT id, datum, DATE_FORMAT(datum, "%d-%m-%Y") AS formatted_date FROM celeste WHERE datum >= NOW() ORDER BY formatted_date ASC;

SELECT id, datum, DATE_FORMAT(datum, "%d-%m-%Y") AS formatted_date FROM celeste WHERE datum >= NOW() ORDER BY datum ASC;

SELECT id, datum, DATE_FORMAT(datum, "%d-%m-%Y") AS formatted_date FROM celeste WHERE STR_TO_DATE(datum, '%Y-%m-%d') BETWEEN '2022-01-01' AND '2022-04-22' ORDER BY datum ASC;


Merk op dat bij sorteren met formatted_date en datum de volgorde anders is.
Die voorbeeld-query van mij werkt, probeer maar.
Christiaan de kleine op 30/04/2022 12:30:41



datum veld staat op varchar (express omdat het eventueel ook ander formaat en tekst zou kunnen zijn.
en ook in notatie dd-mm-yyyy


Wat voor formaten nog meer dan?
Als je dit in plaats van 2022-04-30 als 30 april 2022 of als 'vandaag' opslaat, PHP kan er dan weinig chocolade van maken om mee te rekenen. Bovendien zijn zulke formats en relatieve momenten (vandaag) echt iets voor in de view, en niet voor in de opslag.
Oke, ik krijg nu nog een error, kan hem niet thuis brengen:


De php code:

$SupdateAanwezigheid1 = "UPDATE aanwezigheid SET '$DBfieldNameStatus' = '$lidStatus1' WHERE datum = '$newLidDate1' AND '$DBfieldName' = '$name' AND team = '$fieldTeam'";

De error melding:

Error: UPDATE aanwezigheid SET 'speler3Status' = 'yes' WHERE datum = '2022-05-02' AND 'speler3' = 'Christiaan*de Kleine' AND team = 'X12-1'

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''speler3Status' = 'yes' WHERE datum = '2022-05-02' AND 'speler3' = 'Christiaa...' at line 1



Zal vast een lullige tikfout zijn, maar zie hem zo niet
speler3Status is een veld, dus die hoort niet tussen quotes.

Waarom gebruik je niet een 0 of 1 i.p.v. 'yes'?
- Ariën - op 01/05/2022 10:43:00

speler3Status is een veld, dus die hoort niet tussen quotes.

Waarom gebruik je niet een 0 of 1 i.p.v. 'yes'?


check, quotes weggehaald en idd werkend.

Waarom ik yes gebruik is omdat ik vanuit mijn eigen android applicatie de waardes in heb gesteld op yes, no en maybe. Dit omdat ik de knoptexten zo heb staan zodat de gebruiker zijn aanwezigheid kan aanpassen. en gezien ik daar de makkelijke route gekozen heb is de tekst die hij verzend in mijn get de tekst van de button in de applicatie.
Had je mijn query nou uitgeprobeerd, of ben je van het type dat geen "dankjewel" zegt als ze geholpen worden?

Reageren