kleine B-day reminder maken...
Maar ik zou het eens moeten testen, het is tot nu toe allemaal theorie...
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.
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...
Gewijzigd op 01/01/1970 01:00:00 door Frank -
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.
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?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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
";
?>
$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!
:-) (-: :-) (-: :-) (-: :-) (-:
en uw nek is weer helemaal soepel
format C: /s
en uw schijf is weer helemaal schoon
Joepie, jottem, witte rook, hahaha!
Maar ik zit te denken he, STEL er zijn 10 mensen op dezelfde dag jarig!? wat dan? dan laat ie dus 6 van die mensen zien, en die andere 4 worden vergeten?
Met een beetje een grote site heb je makkelik meer als 10 mensen op een dag jarig, soms...
Gewijzigd op 01/01/1970 01:00:00 door niek s
Edit: Jan, ziet er fraai uit, ik wil er ook nog eens even mee gaan testen. Blijft een aardig onderwerp.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Let maar niet op Jan, we brengen hem dit weekend weer terug