Page 1 sur 2
Requete avec interval de date
Posté : 14 mai 2008, 14:14
par Sebe
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
Posté : 14 mai 2008, 14:37
par Cyrano
Pas sûr que ça marche, mais j'essayerai quelque chose avec WEEK(NOW())
Aucune garantie mais ce serait intéressant comme formule...
Posté : 14 mai 2008, 14:44
par steph29
Posté : 14 mai 2008, 14:53
par Sebe
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
Posté : 14 mai 2008, 14:54
par Cyrano

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 :
Posté : 14 mai 2008, 15:02
par steph29
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

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

Posté : 14 mai 2008, 15:12
par Cyrano
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 |
+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+
Posté : 14 mai 2008, 15:40
par steph29
soit je m'incline, je viens de comprendre mon erreur (oubli du pb de l'annee pour les anniv

)
j'aurais au moins souleve le probleme de la pertinence de la requete
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

Posté : 14 mai 2008, 15:53
par Cyrano
... 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

Posté : 14 mai 2008, 16:35
par steph29
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:
reste a gerer l'exception de la derniere semaine ou dayofyear aura comme valeur 365 et ne nous donneras pas les jours de janvier...
Posté : 14 mai 2008, 16:36
par Sebe
... 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
Posté : 14 mai 2008, 16:39
par Cyrano
Ou encore en utilisant
TIMESTAMPADD 
Posté : 14 mai 2008, 16:49
par steph29
@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

Posté : 14 mai 2008, 16:58
par Cyrano
Teste les extrêmes dans une clause BETWEEN peut-être ?
à tester, il faut arriver à trouver un compromis entre efficacité et rapidité d'exécution dans ce genre de cas...
Posté : 14 mai 2008, 17:21
par steph29
donc l'idee de mon dayofyear est pas si mal que ca
