Hoi mensen,

ik wil op mijn website een kleine remimber maken van verjaardagen.. in een klein boxje rechtsbovenin de pagina moeten bijv 6 mensen komen te staan die binnenkort jarig zijn. Kan iemand mij vertellen hoe ik de data zo kan sorteren dat hij weet welke datum het is en dus aankomende 5 verjaardagen laat zien?

Ik hoop dat ik een beetje duidelijk ben....

groetjes!
Marije
29 februari en 1 maart hebben inderdaad hetzelfde dagnummer. Wil je echter ook diegene in je lijstje hebben die op 29 februari zijn geboren, dan zul je op dagnummer moeten zoeken. Op datum kun je niet vergelijken omdat 29 februari slechts 1x in de 4 jaar voorbij komt. Zoeken op > 2007-02-28 levert volgens mij nooit 29-februari op omdat deze dag niet bestaat in 2007.

Maar ik zou het eens moeten testen, het is tot nu toe allemaal theorie...
Het hangt er denk ik heel erg vanaf of dat geboortedatums die in de DB staan van tevoren goed gecheckt zijn.

Net lokaal getest:
SELECT '2004-02-29' < '2004-03-01'
geeft als resultaat 1

SELECT '2002-02-28' < '2002-03-01'
geeft als resultaat 1

maar (VERONTRUSTEND!)
SELECT '2002-02-29' < '2002-03-01'
geeft OOK 1

Dat betekent dus dat je niet klakkeloos het geboortejaar kunt vervangen door het huidige jaar, want als je op 29 feb geboren bent gaat het fout.
SELECT dayofyear( '2004-02-29' ) < dayofyear( '2004-03-01' )
Result: 1 (TRUE, 29-02 is kleiner dan 01-03)
2004 kent een schrikkeljaar => 29-02 is dag 60

SELECT dayofyear( '2003-02-29' ) < dayofyear( '2003-03-01' )
Result: 0 (FALSE, 29-02 is niet kleiner dan 01-03)
2003 kent geen schrikkeljaar => 29-02 wordt gezien als 01-03, dag 60

SELECT dayofyear( '2002-02-29' ) < dayofyear( '2002-03-01' )
Result: 0 (FALSE, 29-02 is niet kleiner dan 01-03)
2002 kent geen schrikkeljaar => 29-02 wordt gezien als 01-03, dag 60

Ik kan het mis hebben, maar volgens mij is er niets verontrustend aan de bevindingen van Jan. Je moet alleen goed in de gaten houden wat het dagnummer is.

Of sla ik hier de plank helemaal mis?

Edit: Hier maak je 'gebruik' van het feit dat een niet-bestaande datum voor MySQL geen enkel probleem is. Die telt rustig door...
haha, dit snap ik allemaal niet meer hoor :)... wat ik opmerk trouwens is dat hij alles in het verleden niet weergeeft. Wat dus ook inhoudt dat hij mensen die pas 'volgend' jaar jarig zijn.. bijvoorbeeld 1 januari 2007, die laat hij ook niet zien.. is het alleen iets voor dit jaar?

Marije
Hoi Marije,

datumberekeningen zijn altijd moeilijk, vandaar dat Frank en ik het interessant vinden :-)
Even voor de goede orde: we hebben een lijst met geboortedatums. De vraag aan de database is: welke zes personen zijn er het eerst jarig. Stel dat het nu september is, en de eerstvolgende zes personen zijn pas in januari volgend jaar jarig, dan moet het evengoed goed gaan. Klopt het zo?

@ Frank: dat brengt me meteen op het volgende probleem:
SELECT dayofyear( '2003-12-29' ) < dayofyear( '2004-01-01' ) gaat ook fout :P

Ik ga eens kijken of het nog anders kan.
Hoi Jan,

Nou nee eigenlijk niet. De mensen die bijvoorbeeld op 1 januari 2007 jarig zijn of 20 januari (dus 2007) die worden niet weergegeven?

Terwijl dat wel zou moeten bedoel je?
Ik ben er nog even ingedoken (jaja, ik weet het, maar als zoiets in je hoofd zit, krijg het er dan nog maar eens uit) en zie geen elegante oplossing. Dus dan maar brute-force:
<?php
$sql = "
SELECT datum,
CASE
WHEN MONTH(datum) < MONTH(CURDATE()) THEN CONCAT(YEAR(CURDATE())+1, DATE_FORMAT(datum, '-%m-%d'))
WHEN MONTH(datum) > MONTH(CURDATE()) THEN CONCAT(YEAR(CURDATE()), DATE_FORMAT(datum, '-%m-%d'))
WHEN MONTH(datum) = MONTH(CURDATE()) THEN
CASE
WHEN DAYOFMONTH(datum) < DAYOFMONTH(CURDATE()) THEN CONCAT(YEAR(CURDATE())+1, DATE_FORMAT(datum, '-%m-%d'))
WHEN DAYOFMONTH(datum) >= DAYOFMONTH(CURDATE()) THEN CONCAT(YEAR(CURDATE()), DATE_FORMAT(datum, '-%m-%d'))
END
END
AS volgende_verjaardag
FROM tabelnaam
ORDER BY volgende_verjaardag DESC
LIMIT 6
";
?>
Deze lokaal getest, en werkt. Het veld 'datum' staat hier voor de geboortedatum van de persoon. Deze query geeft de eerstvolgende zes personen weer die jarig worden of vandaag al zijn.
ik ga het proberen. kun je bij deze wel zien welke mensen in het volgende jaar jarig zijn? (handig als het bijvoorbeeld december is)
geweldig... precies zoals ik het in gedachten had.. bedankt!

Reageren