Requete avec interval de date

Mammouth du PHP | 545 Messages

14 mai 2008, 14:14

Bonjour,

J'aimerai savoir comment je dois m'y prendre pour afficher les anniversaires de la semaine à partir de cette table:

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `jos_classement_participant` ( `id` int(11) NOT NULL auto_increment, `nom` varchar(45) NOT NULL default '', `prenom` varchar(45) NOT NULL default '', `naissance` date NOT NULL default '0000-00-00', `sexe` enum('H','F') NOT NULL default 'H', `published` tinyint(1) NOT NULL default '1', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=5282 ;
Pour fêter le jour même, je ne rencontre pas de problème avec ma requête:
$years = (date('Y')) - $nbre_annee;
$date = date('m-j');

/////////// Liste des coureurs né le  ///////////
$query = "SELECT DISTINCT(nom), prenom, part.id"
	. "\n FROM #__classement_participant part, #__classement_chang chang "
	. "\n WHERE chang.participant_id = part.id"
	. "\n AND part.naissance LIKE '%-" . $date . "'"
	. "\n AND chang.annee >= '" . $years . "'"
	. "\n AND part.published = '1'"
	. "\n GROUP BY nom"
	. "\n ORDER BY nom ASC"
	;
mais je ne vois pas comment apporter les modifications nécessaire à l'affichage des anniversaires de la semaine ... quelqu'un aurait-il une idée ?

Merci
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

14 mai 2008, 14:37

Pas sûr que ça marche, mais j'essayerai quelque chose avec WEEK(NOW()) :-k

Aucune garantie mais ce serait intéressant comme formule...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 14:44


Mammouth du PHP | 545 Messages

14 mai 2008, 14:53

J'ai essayé de mon coté à utiliser un format date:
$semaine = date('W');
Numéro de semaine dans l'année ISO-8601, les semaines commencent le lundi (ajouté en PHP 4.1.0)
Exemple : 42 (la 42ème semaine de l'année)
et d'ajouter dans ma requête:
. "\n WHERE DATE_FORMAT(part.naissance,'%W') = '" . (int)$semaine . "'"
mais
20DB function failed with error number 1064
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE DATE_FORMAT(part.naissance,'%W') = '20' GROUP BY nom' at SQL=SELECT DISTINCT(nom), prenom, part.id FROM jos_classement_participant part, jos_classement_chang chang WHERE chang.participant_id = part.id WHERE DATE_FORMAT(part.naissance,'%W') = '20' GROUP BY nom
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

14 mai 2008, 14:54

:shock: As-tu bien regardé à quoi sert TO_DAYS ??? Selon toi, quel rapport y a-t-il avec la question ? Il veut une semaine de l'année, or TO_DAYS retourne quoi ?
Retourne le nombre de jours depuis la date 0 jusqu'à la date date
L'utilisation de WEEK à ce titre sera beaucoup plus appropriée, tu ne crois pas ? Or WEEK attend en paramètre une date : on peut lui donner la date courante.

Exemple :

Code : Tout sélectionner

mysql> SELECT WEEK(NOW()); +-------------+ | WEEK(NOW()) | +-------------+ | 19 | +-------------+ 1 row in set (0.00 sec)
Partant de là, il peut définir une clause WHERE sur les dates anniversaires du genre :

Code : Tout sélectionner

... WHERE WEEK(date_anniv) = WEEK(NOW());
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 15:02

J'aimerai savoir comment je dois m'y prendre pour afficher les anniversaires de la semaine à partir de cette table:
et bien on peut interprete la semaine par les 7 prochains jours :roll: ce qui me semblerait plus pertinent....

car avec le numero de semaine:
si on est dimanche on aura les anniversaires ayant eu lieu cette semaine
si on est lundi on aura les anniversaires a venir...
l'information est diametralement differente ;)

avec la difference de jours on aura tout le temps les 7 prochains jour.

si j'ai fourche je m'en excuse mais il n'est pas non plus explicite qu'il desire utilise les n° de semaine... :twisted:

Mammouth du PHP | 19672 Messages

14 mai 2008, 15:12

Ben la question est claire :
...comment je dois m'y prendre pour afficher les anniversaires de la semaine...
On ne peut que sous-entendre "la semaine en cours" qu'on soit au début ou à la fin de ladite semaine.

Reste à déterminer si on fait commencer la semaine le lundi ou le dimanche et le second paramètre optionnel de WEEK permet de faire ça :
WEEK(date [,mode])

Avec un seul argument, retourne le numéro de la semaine dans l'année de la date date, dans un intervalle de 0 à 53 (oui, il peut y avoir un début de semaine numéro 53), en considérant que Dimanche est le premier jour de la semaine. Avec deux arguments, la fonction WEEK() vous permet de spécifier si les semaines commencent le Dimanche ou le Lundi et la valeur retournée sera dans l'intervalle 0-53 ou bien 1-52.
En dessous de cette description se trouve le tableau des valeurs possibles pour le second argument :

Code : Tout sélectionner

+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ | Valeur | Signification | +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+ | 0 | La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année | | 1 | La semaine commence le Monday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours | | 2 | La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année | | 3 | La semaine commence le Monday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours | | 4 | La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours | | 5 | La semaine commence le Monday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année | | 6 | La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours | | 7 | La semaine commence le Monday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année | +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 15:40

soit je m'incline, je viens de comprendre mon erreur (oubli du pb de l'annee pour les anniv :oops: )

j'aurais au moins souleve le probleme de la pertinence de la requete :twisted:

du coup pour la date du jour on peut aussi faire:
WHERE MONTH(part.naissance)=MONTH(NOW()) AND DAYOFMONTH(part.naissance)=DAYOFMONTH(NOW())
mais il serait rigolo de voir comment proceder au calcul des anniversaires des 7 prochians jours ;)

Mammouth du PHP | 19672 Messages

14 mai 2008, 15:53

... il serait rigolo de voir comment proceder au calcul des anniversaires des 7 prochians jours ;)
En transformant la date en timestamp et en y additionnant (7 * 24 * 60 * 60) avant de reconvertir le résultat en date ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 16:35

je n'ai pas franchement compris ton ajout est toujours fixe... tu n'auras toujours pas la difference non?

j'aurais plutot tendance a jouer avec DAYOFYEAR, ce qui donnerais un truc du genre:

Code : Tout sélectionner

WHERE (DAYOFYEAR(part.naissance))-DAYOFYEAR(NOW())) <=7
reste a gerer l'exception de la derniere semaine ou dayofyear aura comme valeur 365 et ne nous donneras pas les jours de janvier...

Mammouth du PHP | 545 Messages

14 mai 2008, 16:36

... il serait rigolo de voir comment proceder au calcul des anniversaires des 7 prochians jours ;)
En transformant la date en timestamp et en y additionnant (7 * 24 * 60 * 60) avant de reconvertir le résultat en date ;)
Moi, j'aurai fait un truc comme ceci:
$date = date('j') + 7;
et en passant la variable dans la requête :
. "\n WHERE part.naissance LIKE '%-" . $date . "' . '-%'";
Mais je suis loin de pouvoir affirmer que cela fonctionnerait !

Pour le reste, la proposition de Cyrano ne fonctionne pas :
. "\n WHERE WEEK(part.naissance) = WEEK(NOW())"
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE WEEK(part.naissance) = WEEK(NOW()) GROUP BY nom' at line SQL=SELECT DISTINCT(nom), prenom, part.id FROM jos_classement_participant part, jos_classement_chang chang WHERE chang.participant_id = part.id WHERE WEEK(part.naissance) = WEEK(NOW()) GROUP BY nom
Sebe

Pour moi, le PHP est une nouvelle aventure qui a commencée fin octobre 2005 ... c'est plus exitant que le HTML!

Mammouth du PHP | 19672 Messages

14 mai 2008, 16:39

Ou encore en utilisant TIMESTAMPADD :)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 16:49

@sebe: quelle est ta version de ton serveur mysql?

@cyrano: ok tu ajoute un nb de jour a ta date d'anniversaire mais tu ne vas pas tester les 7 cas possibles?

car
TIMESTAMPADD(WEEK,1,'2007-01-02')
et
TIMESTAMPADD(WEEK,1,'2008-01-02')
ne donne pas les meme valeur ;)

Mammouth du PHP | 19672 Messages

14 mai 2008, 16:58

Teste les extrêmes dans une clause BETWEEN peut-être ? :-k
à tester, il faut arriver à trouver un compromis entre efficacité et rapidité d'exécution dans ce genre de cas...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 175 Messages

14 mai 2008, 17:21

donc l'idee de mon dayofyear est pas si mal que ca ;)