Anniversaires

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Anniversaires

par Hubert Roksor » 02 déc. 2006, 15:05

Je ne comprends pas, quel est l'intérêt de cette méthode par rapport, par exemple, au stockage du jour anniversaire dans un CHAR(4) ?

De plus, le code PHP ne me semble pas correct puisque tu divises une date par 10 000 (?). À priori, il vaudrait mieux utiliser les maths sur des nombres, pas sur des dates, donc convertir la date de naissance en timestamp, eg
$age = round((time() - strtotime($client_birthdate)) / 31536000);
(ça reste approximatif, je n'ai pas réfléchi aux années bissextiles mais ça devrait aller)

par momox » 02 déc. 2006, 13:50

A l'aide de DATE_FORMAT j'ai juste eu a modifier le format de ma date d'anniversaire (AAAA-MM-JJ) et j'ai utilisé le script de Shrell, que je remercie au passage.
Et a l'aide de UNIX_TIMESTAMP, j'ai converti cette date en timestamp, ce qui m'a permi de calculer l'age a l'aide de
floor((date("Ymd")-date("Ymd",$client_birthdate))/10000)
@++

par momox » 01 déc. 2006, 20:00

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

par Hubert Roksor » 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.

par momox » 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 ;)

par zeus » 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 :?

par Shrell » 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

par momox » 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 :)
@++

par Hubert Roksor » 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.

par momox » 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:
@+

par Hubert Roksor » 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.

par momox » 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...

par zeus » 30 nov. 2006, 16:20

Et encore ... seulement 7 jours avant leur naissance ;)

par Hubert Roksor » 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:

par fred9999 » 30 nov. 2006, 14:38

Pour anniversaire c'es com ça:

:anniversaire: