Anniversaires

Mammouth du PHP | 1511 Messages

29 nov. 2006, 15:29

Bonjour,
j'ai fait une petite recherche sur le forum, mais j'ai pas réussi a trouver ce que je voulais, enfin bon...
Je réalise une petite application pour ma mère pour gerer ses clients et je n'arrive pas a faire une petite chose, a savoir séléctionner tous les gens dont l'anniversaire est dans les 7 jours suivants...
Je stocke dans ma BDD la date au format xx/xx/xx (je voulais utiliser un timestamp a la base, mais je me suis apercu que certains de ses clients étaient nés avant 1970 :lol: ).
Enfin bon, voila, j'arrive pas a trouver, et en faisant une recherche sur le forum, je n'ai rien trouvé de concluant et qui puisse m'aider...
Au départ, j'avais fait ca:

Code : Tout sélectionner

SELECT client_id, client_nom, client_prenom, client_birthdate FROM clients WHERE TO_DAYS(NOW()) - TO_DAYS(client_birthdate) <= 7;
Mais je me suis apercu que ca ne fonctionnerait pas du tout...
Donc je vous remercie d'avance :)

Mammouth du PHP | 2937 Messages

30 nov. 2006, 14:34

Salut, Morgan!

As-tu vérifié si le champ client_birthdate était de type DATETIME?

Cf. la documentation officielle. :wink:

Mammouth du PHP | 592 Messages

30 nov. 2006, 14:38

Pour anniversaire c'es com ça:

:anniversaire:

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

30 nov. 2006, 15:06

As-tu vérifié si le champ client_birthdate était de type DATETIME?
...ou même DATE en fait (ce que je recommanderais).

Autre astuce : si vous utilisez la valeur de la colonne dans une fonction ou un calcul, MySQL ne pourra pas utiliser d'index pour la recherche. Au lieu d'utiliser

Code : Tout sélectionner

WHERE TO_DAYS(NOW()) - TO_DAYS(client_birthdate) <= 7
préférez une solution du type (à vérifier, je n'utilise pas les fonctions de date de MySQL)

Code : Tout sélectionner

WHERE client_birthdate >= DATE_SUB(NOW(), INTERVAL 7 DAYS)
ou

Code : Tout sélectionner

WHERE client_birthdate BETWEEN '2006-11-25' AND '2006-12-02'
Au fait, t'as mis quoi comme année dans client_birthdate, parce que si c'est l'année de naissance tu ne souhaiteras bon anniversaire qu'aux nouveaux-nés. :roll:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

30 nov. 2006, 16:20

Et encore ... seulement 7 jours avant leur naissance ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1511 Messages

01 déc. 2006, 00:17

Justement, c'est la date de naissance que j'enregistre, et non la date du prochain anniversaire, donc ce qu'il faut que je voie, c'est si je ne peux pas ignorer le nombre d'années.
Par contre, j'avais une petite idée.
Si mon champ est donc de type datetime, en faisait une requete de type

Code : Tout sélectionner

WHERE (MONTH(NOW())*DAY(NOW()))-(MONTH(client_birthdate)*DAY(client_birthdate)) >= 7
Ca peut marcher non?
Ca parait une peu biscornu, mais je me suis fait cette idée la...
Ptet que ca peut marcher, enfin bon, faut que je teste...

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 déc. 2006, 00:23

À mon avis, crée un champs "anniversaire" CHAR(4) (ou SMALLINT si tu préfères) avec la date anniversaire et utilise BETWEEN comme dans la requête que j'ai posté plus haut.

Mammouth du PHP | 1511 Messages

01 déc. 2006, 00:47

Si je le fais tel que tu l'as marqué, ca ne marchera pas, sauf pour les nouveaux nés comme dit plus haut :lol:
@+

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 déc. 2006, 01:09

J'ai pas précisé, mais par "date anniversaire" j'entends, "sans l'année". Donc juste "0205" pour quelqu'un né le 5 février 1970 par exemple. Ça t'évite tous les calculs compliqués qui, je le rappelle, empêchent l'utilisation de l'index.

Mammouth du PHP | 1511 Messages

01 déc. 2006, 13:50

Le problème étant que je souhaite afficher l'age aussi...
Mais bon, je crois avoir l'idée en tête sur comment faire ca :)
@++

Eléphant du PHP | 377 Messages

01 déc. 2006, 15:22

en gardant les dates de naissance au format date, tu peux essayer ca :

Code : Tout sélectionner

WHERE DATE_FORMAT(`client_birthdate ` ,'%m%d') BETWEEN DATE_FORMAT(NOW() ,'%m%d') AND DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 7 DAY), '%m%d')
au niveau des index je ne sais pas trop ce que ca donne, mais sinon ca a l'air de marcher tout en te permettant d'afficher l'age de la personne
Petit scarabée deviendra grand

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

01 déc. 2006, 15:42

Pour les index, comme l'a dit Hubert Roksor, ils seront inutilisables car il y a application du fonction sur le champs de la base :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Mammouth du PHP | 1511 Messages

01 déc. 2006, 15:54

Je vais regarder vos astuces et je vous tiens au courant, pour le moment, je file au trot vers le lycée ;)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

01 déc. 2006, 19:57

Tu peux garder les deux champs --c'était mon idée même si je ne l'ai pas précisé ;)-- "client_birthdate" et "anniveraire" ("client_birthday" ou "client_anniversary" si tu préfères). Avec l'un tu sélectionnes les enregistrements et avec l'autre tu calcules l'âge. L'un ne contient que le jour d'anniversaire tandis que l'autre contient la date de naissance complète.

Mammouth du PHP | 1511 Messages

01 déc. 2006, 20:00

Eventuellement, ce peut être une solution :)
@+