Page 1 sur 2
Anniversaires
Posté : 29 nov. 2006, 15:29
par momox
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

).
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

Posté : 30 nov. 2006, 14:34
par Victor BRITO
Salut, Morgan!
As-tu vérifié si le champ client_birthdate était de type DATETIME?
Cf.
la documentation officielle.

Posté : 30 nov. 2006, 14:38
par fred9999
Pour anniversaire c'es com ça:

Posté : 30 nov. 2006, 15:06
par Hubert Roksor
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
préférez une solution du type (à vérifier, je n'utilise pas les fonctions de date de MySQL)
ou
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.

Posté : 30 nov. 2006, 16:20
par zeus
Et encore ... seulement 7 jours avant leur naissance

Posté : 01 déc. 2006, 00:17
par momox
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...
Posté : 01 déc. 2006, 00:23
par Hubert Roksor
À 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.
Posté : 01 déc. 2006, 00:47
par momox
Si je le fais tel que tu l'as marqué, ca ne marchera pas, sauf pour les nouveaux nés comme dit plus haut

@+
Posté : 01 déc. 2006, 01:09
par Hubert Roksor
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.
Posté : 01 déc. 2006, 13:50
par momox
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

@++
Posté : 01 déc. 2006, 15:22
par Shrell
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
Posté : 01 déc. 2006, 15:42
par zeus
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

Posté : 01 déc. 2006, 15:54
par momox
Je vais regarder vos astuces et je vous tiens au courant, pour le moment, je file au trot vers le lycée

Posté : 01 déc. 2006, 19:57
par Hubert Roksor
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.
Posté : 01 déc. 2006, 20:00
par momox
Eventuellement, ce peut être une solution

@+