Ik wil met onderstaande query de verjaardagen van deze week halen, behalve vandaag. Maar helaas lukt het niet om de verjaardagen van vandaag over te slaan.

Weet iemand een manier? Die ook werk bij de schrikkeljaren en jaren voor 1970?

SELECT *, 
DAYOFMONTH ( datum ) AS dag, 
MONTH ( datum ) AS maand, 
(YEAR( CURRENT_DATE( ) ) - YEAR(datum)) AS leeftijd
FROM `verjaardag`  
WHERE 
 ( 
	DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) ) 
	AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( DATE_SUB( datum, INTERVAL 7 DAY ) ) +7
 )
OR 
 (
	DAYOFYEAR( CURRENT_DATE( ) ) > DAYOFYEAR( datum ) -7
	AND DAYOFYEAR( CURRENT_DATE( ) ) <= DAYOFYEAR( datum )
 )
ORDER BY maand, dag, leeftijd ASC
Gooi de backtics ` nog even met een grote boog richting prullenbak, dat is de enige juiste plek voor deze zooi.

De jaren voor 1970 zijn geen enkel probleem. Tenzij jij een TIMESTAMP gebruikt, maar dan vraag je ook om problemen... Gebruik een DATETIME en dat probleem is ook weer de wereld uit.

Wanneer je niet de verjaardagen van vandaag wilt hebben, dan moet je nog even een AND toevoegen die de verjaardagen van vandaag buitensluit.
En hoe zou ik dan de verjaardagen van vandaag moeten uitsluiten?
Met dit : DAYOFYEAR( datum ) > (DAYOFYEAR( CURRENT_DATE )+1) lukt dat niet want in een schrikkeljaar veranderd dit.
Zit me hier suf te piekeren hoe ik dit aan zal pakken en met Google kom ik ook niet verder.
Ik maak trouwens gebruik van een DATE field dus dat zit dacht ik wel goed.
<?php
$sql = "
SELECT
naam,
CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')) AS verjaardag_dit_jaar
FROM verjaardag
WHERE WEEK(CURDATE()) = WEEK(CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d')))
AND CURDATE() != CONCAT(YEAR(geboortedatum) , DATE_FORMAT(geboortedatum, '-%m-%d'))";
?>
@ Jan
Dit is niet de oplossing tot mijn probleem volgens mij?
Waarom gebruik je CONCAT? Je haalt nu heel omslachtig YYYY-MM-DD uit een DATE field? Maar met CURDATE doe je toch hetzelfde? En wat doet WEEK dan voor jouw, precies?

Even mijn voorbeeld duidelijker formuleren:

De opbouw van de tabel is :
CREATE TABLE `verjaardag` (
`id` int(8) NOT NULL auto_increment,
`datum` date NOT NULL default '0000-00-00',
`lid` varchar(255) NOT NULL default '',
PRIMARY KEY (`id`) ) TYPE=MyISAM;

En een deel van de data:
1955-10-26 André Dubbeldam
1988-10-26 Cornélie van Houwelingen
1985-10-26 Linda van Wijngaarden
1960-10-27 Janny Visscher
1960-10-29 Leo Visscher
1950-10-30 Geertje van Kooten
1980-10-31 Jeroen van Andel
2005-11-01 Test naam
1984-11-03 Jurgen Adriaanse
1990-11-07 Hanna van der Ham

Met jouw(Jan) query krijg ik het volgende :
André Dubbeldam 1955-10-26
Cornélie van Houwelingen 1988-10-26
Janny Visscher 1960-10-27
Leo Visscher 1960-10-29
Jeroen van Andel 1980-10-31

Je ziet een jarige in het verleden (gisteren) en de jarige "Test naam" valt toch ook binnen een week?

In feite wil ik alle jarigen binnen nu en zeven dagen en niet die van vandaag. Met die van vandaag wil ik iets anders gaan doen....

@Frank
De reden van dat 1970 erbij zet is dat niemand met het advies van UNIX_TIMESTAMP komt.
Wat die backtopics betreft, waarom geeft PHPMyadmin dit wel? Het werkt ook zonder oke maar snap je opmerking niet zo.
dit werkt :-P :



<?php
$sql = "
SELECT 
    user, geboortedatum
FROM 
    users
WHERE 
        DATE_ADD( geboortedatum, INTERVAL( YEAR( CURDATE( ) ) - YEAR( geboortedatum ) ) YEAR )
        BETWEEN 
        NOW( )
    AND 
        DATE_ADD( NOW( ) , INTERVAL 7 DAY ) ;
";
$res = mysql_query($sql) or die("fout:<br />SQL:<br /><pre> ".$sql."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res) != 1) 
{
	echo '<h1>Jarigen komende week:</h1>';
} 
else 
{
	echo '<h1>Jarige komende week: </h1>';
}
echo '<p>';
if (mysql_num_rows($res) > 0)
{
	while ($rij = mysql_fetch_assoc($res))
	{
		if (isset($_SESSION['userlogin']))
		{
			echo '<a href="http://www.xxx.nl?p=profiel&amp;id='.$rij['id'].'">';
		}
		echo $rij['user'];
		if (isset($_SESSION['userlogin']))
		{
			echo '</a>';
		}
		echo ' is jarig op '.$rij['geboortedatum'].'. <br />'."\n";
	}
}
else
{
	echo '<i>Geen jarigen</i>';
}

echo "\n</p>\n";
echo "\n<p>\n";



$sql2 ="
SELECT user,id,geboortedatum,
CASE
WHEN MONTH( geboortedatum ) < MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) > MONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN MONTH( geboortedatum ) = MONTH( CURDATE( ) )
THEN
CASE
WHEN DAYOFMONTH( geboortedatum ) < DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) +1, DATE_FORMAT( geboortedatum, '-%m-%d' ) )
WHEN DAYOFMONTH( geboortedatum ) >= DAYOFMONTH( CURDATE( ) )
THEN CONCAT( YEAR( CURDATE( ) ) , DATE_FORMAT( geboortedatum, '-%m-%d' ) )
END
END AS volgende_verjaardag
FROM users
ORDER BY volgende_verjaardag ASC
LIMIT ".mysql_num_rows($res).",5
"; 
$res2 = mysql_query($sql2) or die("fout:<br />SQL:<br /><pre> ".$sql2."</pre><br />Fout:<br />".mysql_error()."<br />ERRNO: <br />".mysql_errno());
if (mysql_num_rows($res2) > 0) 
{
	echo '<h1>Volgende 5 jarigen:</h1>';
} 
echo '<ul>';
while ($rij2 = mysql_fetch_assoc($res2))
{
	echo '<li>';
	if (isset($_SESSION['userlogin']))
	{
		echo '<a href="http://www.xxx.nl?p=profiel&amp;id='.$rij2['id'].'">'.$rij2['user'].'</a>';
	}
	else
	{
		echo $rij2['user'];
	}
	echo ' is jarig op '.$rij2['volgende_verjaardag'].'</li>'."\n";
}
?>
Roverts schreef op 27.10.2006 15:09
@ Jan
Dit is niet de oplossing tot mijn probleem volgens mij?
Waarom gebruik je CONCAT? Je haalt nu heel omslachtig YYYY-MM-DD uit een DATE field? Maar met CURDATE doe je toch hetzelfde? En wat doet WEEK dan voor jouw, precies?


Ik neem aan dat in dat DATE field de geboortedatum van een persoon staat? Dan geeft die CONCAT die ik gebruik de verjaardag in het huidige jaar. Heb je de query uitgetest? Uit je "volgens mij" maak ik op van niet?

Met jouw(Jan) query krijg ik het volgende :
André Dubbeldam 1955-10-26
Cornélie van Houwelingen 1988-10-26
Janny Visscher 1960-10-27
Leo Visscher 1960-10-29
Jeroen van Andel 1980-10-31

Je ziet een jarige in het verleden (gisteren) en de jarige "Test naam" valt toch ook binnen een week?

In feite wil ik alle jarigen binnen nu en zeven dagen en niet die van vandaag. Met die van vandaag wil ik iets anders gaan doen....

Zo heb je je vraag niet geformuleerd aan het begin van je topic! Je vroeg dit:

Ik wil met onderstaande query de verjaardagen van deze week halen, behalve vandaag. Maar helaas lukt het niet om de verjaardagen van vandaag over te slaan.

De verjaardagen van deze week betekent: als het nu woensdag is, alle verjaardagen vanaf maandag tot zondag, behalve woensdag. Je kunt de week ook op zondag beginnen eventueel. Als je de verjaardagen van de komende zeven dagen wilt, is dat een andere query.
Ik neem aan dat in dat DATE field de geboortedatum van een persoon staat? Dan geeft die CONCAT die ik gebruik de verjaardag in het huidige jaar. Heb je de query uitgetest? Uit je "volgens mij" maak ik op van niet?


In het DATE field staan idd de geboortedata. De query heb ik getest en heb ik hierboven geplaatst.

@Boris();
Ik zal hem gaan testen ziet er leuk uit, kan ik best wat mee. Maar ik zie nergens de filter om vandaag uit te sluiten?
Dit is hem (getest):

SELECT
	geboortedatum,
	CONCAT(YEAR(CURDATE()) , DATE_FORMAT(geboortedatum, '-%m-%d')) AS verjaardag_dit_jaar
FROM verjaardag
WHERE CONCAT(YEAR(CURDATE()) , DATE_FORMAT(geboortedatum, '-%m-%d'))
BETWEEN DATE_ADD(CURDATE() , INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 8 DAY)
@Jan
Top dat is hem, het lijkt zo logisch als je het ziet staan, maar kon er niet opkomen. Bedankt voor de hulp!!!

Reageren