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