Requete avec interval de date

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 : Requete avec interval de date

par steph29 » 15 mai 2008, 10:11

je ne vois pas comment tu as pu obtenir une periode de 13 jours avec la fonction week :?


je testerais un truc du genre
$query = "SELECT (DAYOFYEAR(part.naissance)-DAYOFYEAR(NOW()) ) AS diff_jour , part.nom, part.prenom, part.id, part.naissance
FROM #__classement_participant part, #__classement_chang chang
WHERE chang.participant_id = part.id
AND ( 
         (diff_jour <=7 AND diff_jour >=0) 
         OR
         ROUND(diff_jour) >= 358
)
AND part.published = '1'
ORDER BY MONTH(part.naissance),DAY(part.naissance)";
PS: le >=358 c'est pour les derniers jour de decembre, afin de recuperer les jours de janvier...
pur les tests il est conseille d'enlever cette ligne, car je n'ai pas pu tester ma requete... :oops:

PS2: j'ai virer le group by nom et le distinct (nom), sinon on vire les homonymes...
si ta base est bien faite on a un id par utilisateur, sinon il faut trouver une autre cle unique ;)

Peut-être un début de solution !

par Invité » 15 mai 2008, 09:09

Salut,

Comme on le dit, la nuit porte ... quoi encore :roll:
Disons que j'arrive à récupérer un bon intervalle de date:
$years = (date('Y')) - $nbre_annee;
$Njour = date('w');

switch ($Njour){
	case '1':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+6));
	break;
	case '2':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-1));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+5));
	break;
	case '3':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-2));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+4));
	break;
	case '4':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-3));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+3));
	break;
	case '5':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-4));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+2));
	break;
	case '6':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-5));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")+1));
	break;
	case '7':
		$jour_min = date("m-j",mktime(0,0,0,date("m"),date("j")-6));
		$jour_max = date("m-j",mktime(0,0,0,date("m"),date("j")));
	break;
	}

/////////// Liste des coureurs né le  ///////////
$query = "SELECT DISTINCT(nom), part.prenom, part.id, part.naissance"
	. "\n FROM #__classement_participant part, #__classement_chang chang "
	. "\n WHERE chang.participant_id = part.id"
	. "\n AND DATE_FORMAT(part.naissance,'%m-j') >= '". $jour_min . "'"
	. "\n AND DATE_FORMAT(part.naissance,'%m-j') <= '". $jour_max . "'"
	. "\n AND part.published = '1'"
	//. "\n AND chang.annee >= '" . $years . "'"
	. "\n GROUP BY nom"
	//. "\n ORDER BY DATE_FORMAT(part.naissance,'%j') ASC"
	;

$database->setQuery( $query );
$partList = $database->loadObjectList();
mais j'ai un problème avec DATE_FORMAT() car mon tableau est vide ... enfin je pense que l'expression '%m-j' ne doit pas être correcte !

Avez-vous une idée ?

Merci

Oups !

par Sebe » 14 mai 2008, 17:54

Désolé Cyrano mais ta proposition:
. "\n AND WEEK(part.naissance) = WEEK(NOW())"
me semble la bonne ! Le problème est que j'avais déjà un 'WHERE' et que je ne l'avais pas vu ... 'AND' c'est mieux !

J'essaye de faire un tableau convenable merci !

EDIT: Non c'est pas encore cela car les dates entre le 06 et le 19 sont reprises !

par steph29 » 14 mai 2008, 17:21

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

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

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

par Cyrano » 14 mai 2008, 16:39

Ou encore en utilisant TIMESTAMPADD :)

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

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

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

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

par Cyrano » 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 | +--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+

par steph29 » 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:

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

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