beste phpers,

ik zoek een oplossing voor het volgende..
uit de database zal de eerst volgende verjaardag moeten worden gehaald.

$result = mysql_query ("SELECT DATE_FORMAT(datum, '%d-%m-') AS datum FROM verjaardag ORDER BY datum ASC LIMIT 0 ,1") or die(mysql_error());
while($row = mysql_fetch_array($result)) {
echo "" . $row[0];
}
?><?php echo date("Y");?>

echter zal er een controlle moeten komen die kijkt of die datum niet al is geweest. de datum is opgeslagen als gebortedatum: YYYY-MM-DD heeft iemand hier een oplossing voor?, kon niks vinden via google.
"WHERE datum > NOW()" ?
Je hebt in de database de geboortedata staan, bijvoorbeeld:
1992-09-04
1988-11-07
2006-12-12

Je wilt nu de regel hebben waarvan de maand en de dag het dichtst bij vandaag is, en hij moet niet al geweest zijn. Ik gok iets in de richting van

SELECT
   datum
FROM
   verjaardag
WHERE
   MONTH(datum) >= MONTH(NOW())
   AND DAY(datum) >= DAY(NOW())
ORDER BY
   DATE_FORMAT(datum, '%m%d') ASC
LIMIT 1


Het zou goed kunnen dat hier een mooiere syntax voor is, want al die functies gebruiken is wat "ranzig" op het eerste gezicht.
hij geeft niet de juiste output: YYYY-MM-DD terwijl hij enkel de MM-DD moet uitgeven.
@christiaan: dan combineer je de gegeven query toch met je eigen query?


SELECT
   DATE_FORMAT(datum, '%d-%m') AS dag
FROM
   verjaardag
WHERE
   MONTH(datum) >= MONTH(NOW())
   AND DAY(datum) >= DAY(NOW())
ORDER BY
   datum ASC
LIMIT 1
dat heb ik geprobeerd maar dat werkte niet.. je krijgt dan de eerste uit de tabel 12-22 DESC ??
Gaat volgens mij niet goed. Wat nou als het Kerstmis is? Dan komt er echt geen datum in Januari uit.
Deze werkt naar mijn idee wel goed.

<?php include ("config_site.php");

$result = mysql_query ("SELECT
DATE_FORMAT(datum, '%d-%m-') AS datum
FROM
verjaardag
WHERE
MONTH(datum) >= MONTH(NOW())
AND DAY(datum) >= DAY(NOW())
ORDER BY
datum ASC
LIMIT 0,1 ") or die(mysql_error());
while($row = mysql_fetch_array($result)) {
echo "" . $row[0];
}
?><?php echo date("Y");?>

heb twee datums toegevoegd die al geweest zijn en hij geeft juni als output dus dat zal goed zijn.
@santhe: stimmt!

@christiaan: dat je 12-22 krijgt komt door de sortering op datum ASC, hij pakt de eerste datum, en sorteert dus op jaar...

Edit: Vond deze query in de user comments van de mysql manual, deze rekent het aantal dagen uit tot de eerst volgende keer dat een datum voorkomt, en houdt rekening met oud en nieuw...


SELECT datum, 
IF(DAYOFYEAR(datum) >= DAYOFYEAR(NOW()),
DAYOFYEAR(datum) - DAYOFYEAR(NOW()),
DAYOFYEAR(datum) - DAYOFYEAR(NOW()) +
DAYOFYEAR(CONCAT(YEAR(NOW()),'-12-31')))
AS dagenTotVerjaardag
FROM verjaardag
ORDER BY dagenTotVerjaardag;
@Rens: dat zou normaal niet mogen omdat we hem enkel dagen en maanden laten sorteren DATE_FORMAT(datum, '%d-%m-') AS datum
of zie ik dat verkeerd?

maar zoals post hier boven: het schijnt te werken...
christiaan schreef op 03.03.2009 08:05
@Rens: dat zou normaal niet mogen omdat we hem enkel dagen en maanden laten sorteren DATE_FORMAT(datum, '%d-%m-') AS datum
of zie ik dat verkeerd?


Dat zie je verkeerd ;-) Ik had in mijn query de select van DATE_FORMAT een andere naam gegeven, en sorteerde op de datum kolom. Ik deed dat omdat DATE_FORMAT een string teruggeeft, waardoor je dus geen juiste sortering als datum kunt doen. Ik had er alleen geen rekening mee gehouden dat bij een sortering op de kolom datum het jaar meegenomen wordt.
Het had dus een sortering op MONTH(datum) ASC, DAY(datum) ASC moeten zijn ofzo

Reageren