datum controlle
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];
}
?>
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()" ?
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
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
datum
FROM
verjaardag
WHERE
MONTH(datum) >= MONTH(NOW())
AND DAY(datum) >= DAY(NOW())
ORDER BY
DATE_FORMAT(datum, '%m%d') ASC
LIMIT 1
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.
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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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];
}
?>
$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];
}
?>
heb twee datums toegevoegd die al geweest zijn en hij geeft juni als output dus dat zal goed zijn.
@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...
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
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;
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;
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
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?
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
1984-06-061980-12-22
dus ik weet niet wat de bedoeling is?
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT DATE_FORMAT(datum, '%d-%m') AS verjaardag,
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 ASC;
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 ASC;
Edit: en om dan alle twijfel weg te nemen over oud en nieuw hier nog een overzichtje met output op een testtabelletje
verjaardag dagenTotVerjaardag
03-05 61
04-06 93
08-06 97
10-12 282
12-12 285
05-02 339
Gewijzigd op 01/01/1970 01:00:00 door Rens nvt
zou het wel handig vinden dat aantal dagen nog te gaan... :P
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php include ("config_site.php");
$result = mysql_query ("SELECT DATE_FORMAT(datum, '%d-%m') AS verjaardag,
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 ASC; ") or die(mysql_error());
while($row = mysql_fetch_array($result)) {
echo "" . $row[0];
}
?>
$result = mysql_query ("SELECT DATE_FORMAT(datum, '%d-%m') AS verjaardag,
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 ASC; ") or die(mysql_error());
while($row = mysql_fetch_array($result)) {
echo "" . $row[0];
}
?>
Gewijzigd op 01/01/1970 01:00:00 door christiaan x
Je ziet de logica ook niet in 06-0622-12 blijkbaar, dat moet zijn:
06-06
22-12 (dus 2 losse data)
In de while list staat na $row[0] geen enter (<br />) dus zet die ze allemaal achter elkaar.
ja die logica zag ik wel maar ik heb niet die output aantal dagen er achter.
doe eens var_dump($row), 't zal je verbazen wat er in de 2e kolom zit ;-)