Page 1 sur 1

Problème recherche sur Age

Posté : 07 mai 2009, 17:24
par Cobaye
Hello, aller je pause une question

J'ai une table ou je stocke une date de Naissance en trois champs : JourNaissance, MoisNaissance, AnneeNaissance

Mais dans mon formulaire de recherche, je choisie un age ! entre 25 et 45 ans par exemple !

Quelle méthode vous utiliseriez pour faire la recherche ? en sachant qu'un membre qui a eu 25 hier doit ressortir !

J'ai des solutions mais je les trouvent lourdes donc j'aimerai vos avis !

Merci

Posté : 07 mai 2009, 17:49
par mere-teresa
Quel moteur de base de données utilises-tu ?

Posté : 07 mai 2009, 17:51
par Cobaye
Mysql

Pour le moment ma requete donne ca :

Code : Tout sélectionner

SELECT IdProfil FROM tab_profils WHERE (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance))), '%Y')+0)>25 AND (DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance))), '%Y')+0)<40

Posté : 08 mai 2009, 00:28
par Elie
Je proposerai ca (Sans l'avoir testé) :
SELECT IdProfil FROM tab_profils WHERE TIMESTAMPDIFF(YEAR,'".date('Y-m-d')."', CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance)) > 25 AND TIMESTAMPDIFF(YEAR,'".date('Y-m-d')."',CONCAT(AnneeNaissance,'-',MoisNaissance,'-',JourNaissance)) < 40

Posté : 08 mai 2009, 10:03
par Ryle
Le plus performant est naturellement de tout restocker dans un champ date et d'utiliser les fonctions de comparaison qui vont bien :).

Toute autre solution sql va impliquer un calcul pour chaque enregistrement et sera naturellement plus lourd... Je te recommande par exemple d'éviter le NOW() et de spécifier la valeur de la date en php (donc en dur dans la requête) pour éviter qu'il ne le recalcul à chaque fois.

Pour limiter les opérations faites par Mysql, je pense que tu dois pouvoir faire une comparaison du genre :
$sql = 'SELECT ...
	WHERE
	  CONCAT(AnneeNaissance,MoisNaissance,JourNaissance) >= '.$dateInf.'
	AND
	  CONCAT(AnneeNaissance,MoisNaissance,JourNaissance) <= '.$dateSup.'
	...';

//Avec 

$dateInf = (date('Y') - 45) . date('md');
$dateSup = (date('Y') - 25) . date('md');
Au final, on ne compare que des chaines et on est pas obligés de tester si la date existe, ça fait toujours ça de moins ;)