Afficher une liste en fonction de l'année. [Fermé]

Signaler
-
Neodcb77
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014
-
Bonjour,

sachant que j'ai créé des dossiers en <-...,2010, 2011,... -> 2014
comprendre par dossier un ligne sql avec id, num_dossier, date_deffet, etc....
date_deffet = date activation et que date_deffet est sous le format 2013-12-31

J'aimerais afficher une liste comme ceci:

Nbr de dossier activées en 2010: 12
Nbr de dossier activées en 2012: 25
Nbr de dossier activées en 2013: 215
Nbr de dossier activées en 2014: 158

attention il y a pas eu de dossier en 2011 donc la liste doit pas afficher : (Nbr de dossier activées en 2011)

voici un début de code mais surement pas complet et non fonctionnel, je comprend pas comment mettre date_deffet pour qu'il ne prenne que les dossier en 2013

ensuite comment créer la liste automatique pour chaque année, a moins que je prend le problème à l'envers ???

<?php
$requete=mysql_query("SELECT * FROM gestion_assur_vehicule WHERE date_deffet = '2013'" ) or die ("Requete impossible" );
$nbre_msg=mysql_num_rows($requete);
echo($nbre_msg);
?>


Merci d'avance pour votre aide.

8 réponses

Messages postés
1508
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
259
Si ta colonne 'date_effet' est du type date, datetime ou timestamp, il te suffit de faire ta requête comme suit :

SELECT YEAR(date_effet) AS annee, COUNT(*) AS nb_dossiers FROM gestion_assur_vehicule GROUP BY annee;
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

Non la date n'est pas du type date. mais je vais vous faire un tableau:

ID num_dossier date_effet date_résiliation

1 254 2004-12-31 2007-01-10
2 642 2005-05-07 2007-01-20
3 123 2004-03-10 2006-05-20
4 645 2006-03-10 2008-01-01
5 310 2007-01-20 2009-02-01

donc la requête en français serait:

lister par année le nombre de dossier actif: pour le tableau ci dessus cela devrais donner:

2004 = 2 lien_vers_page.php qui vas afficher la liste des deux dossier de 2004
2005 = 3 lien_vers_page.php qui vas afficher la liste des deux dossier de 2005
2006 = 4 lien_vers_page.php qui vas afficher la liste des deux dossier de 2006
2007 = 4 lien_vers_page.php qui vas afficher la liste des deux dossier de 2007
2008 = 2 lien_vers_page.php qui vas afficher la liste des deux dossier de 2008
2009 = 1 lien_vers_page.php qui vas afficher la liste des deux dossier de 2009


et la requête qui afficherais tout les dossier de 2004 svp pour ma page qui vas afficher la liste des dossier en fonction de l'année.

Je vous remercie d'avance.
flokocha
Messages postés
1508
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
259
Et elle est de quel type, la date ? Il serait peut-être judicieux de la passer dans un type adéquat... Ne serait-ce que pour pouvoir utiliser les fonctions de date, et notamment en l'occurrence la fonction YEAR() qui est tout indiquée. Sinon tu peux faire la même chose avec un LEFT(date_effet, 4), mais c'est un peu bête...
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
108
Bonjour,


Un select distinct devrait pouvoir faire l'affaire ....?

://sql.sh/cours/distinct


Cordialement
flokocha
Messages postés
1508
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
259
Un select distinct élimera les doublons au niveau des dates en elles-mêmes, et non des années.
Jean_Jacques
Messages postés
1045
Date d'inscription
mercredi 30 avril 2008
Statut
Membre
Dernière intervention
5 mars 2014
108
C'est juste !
Et je pressens que ton LEFT(date_effet, ) pourrait bien trouver à s'employer ...
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

flokocha ma date est de type varchar(300) et je ne sais pas la modifier car le code de beaucoup de page est déjà poser sur cette conception. (je sais ça me limite énormément)

Jean_Jacques : J'ai pas trop compris. désolé je suis un débutant qui apprend chaque jour.

Voila ce que j'ai pu composer:
$select = "select * from gestion_dos_client where date_effet between '2004-01-01' and '2004-12-31') and ( date_resiliation between '2004-01-01' and '2004-12-31')";

qui affiche une erreur:
Erreur : 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 ') and ( date_resiliation between '2004-01-01' and '2004-12-31')' at line 1

je pense que c'est du au fait que je lui demande deux condition en meme temps avec "and". Comment faire ?
flokocha
Messages postés
1508
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
259
On en revient toujours au même problème : tu ne peux pas utiliser "between ... and ..." avec une colonne de type varchar. Comment veux tu que mysql sache qu'une chaine de caractères est située entre deux autres ? Pour mysql, c'est comme si tu demandais si "chien" est compris entre "poule" et "chat". :)

D'où l'intérêt de travailler avec des dates... Mais si tu tiens absolument à rester sur du varchar, tu peux toujours faire ceci :

SELECT LEFT(date_effet, 4) AS annee, COUNT(*) AS nb_dossiers FROM gestion_assur_vehicule GROUP BY annee;
Neodcb77
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

heuu.... je vois pas comment la placer ou l'écrire complétement.

si j'ai bien compris ceci:
$select = "select * from gestion_assur_prevoyance where date_effet between '2004-01-01' and '2004-12-31' and date_resiliation between '2004-01-01' and '2004-12-31'";

tu le modifie et fait ceci ? :
$select = "SELECT LEFT(date_effet, 4) AS annee, COUNT(*) AS nb_dossiers FROM gestion_assur_vehicule GROUP BY annee";
flokocha
Messages postés
1508
Date d'inscription
lundi 8 mars 2004
Statut
Membre
Dernière intervention
10 octobre 2015
259
Oui mais ça t'affichera par contre le nombre de dossiers par année, et pas une liste de ceux-ci. C'est ce que tu demandes dans ton premier post.
Neodcb77
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

voici mon code complet





<table cellpadding="0" cellspacing="0">
<tr>
<td width="990" height="224" align="left" valign="top" colspan="3">
<table class="cadre" width="100%" bgcolor="#FFFFCC">
<tr>
<td width="986">
<p><b><span style="font-size:11pt;"> RESULTAT DE LA RECHERCHE: FIN DE CONTRAT VEHICULE DANS MOIN DE 60 JOURS</span></b></p>
</td>
</tr>
<tr>
<td width="986" height="290" align="left" valign="top">
<div style="width:986px; height:610px; background-color:rgb(255,255,255); overflow:auto; border:solid 1px black;">



<?php

$limite=$_GET['limite'];
$nombre = 20; // on va afficher 5 résultats par page.
if (!isset($limite)) $limite = 0; // si on arrive sur la page pour la première fois
// on met limite à 0.

$path_parts = pathinfo($_SERVER['PHP_SELF']);
$page = $path_parts['basename'];





$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;


function displayNextPreviousButtons($limite,$total,$nombre,$page) {
$limitesuivante = $limite + $nombre;
$limiteprecedente = $limite - $nombre;
echo '<table><tr>'."\n";
if($limite != 0) {
echo '<td valign="top">'."\n";
echo '<form action="'.$page.'" method="post">'."\n";
echo '<input type="submit" value="précédents">'."\n";
echo '<input type="hidden" value="'.$limiteprecedente.'" name="limite">'."\n";
echo '</form>'."\n";
echo '</td>'."\n";
}
if($limiteSuivante < $total) {
echo '<td valign="top">'."\n";
echo '<form action="'.$page.'" method="post">'."\n";
echo '<input type="submit" value="suivants">'."\n";
echo '<input type="hidden" value="'.$limitesuivante.'" name="limite">'."\n";
echo '</form>'."\n";
echo '</td>'."\n";

}
echo '</tr></table>'."\n";
}

function affichePages($nombre,$page,$total) {
$nbpages=ceil($total/$nombre);
$numeroPages = 1;
$compteurPages = 1;
$limite = 0;
//echo '<table border = "0" ><tr>'."\n";
while($numeroPages <= $nbpages) {
// echo '<td ><a href = "'.$page.'?limite='.$limite.'">'.$numeroPages.'/'.$nbpages.'</a></td>'."\n";
$limite = $limite + $nombre;
$numeroPages = $numeroPages + 1;
$compteurPages = $compteurPages + 1;
if($compteurPages == 20) {
$compteurPages = 1;
echo ''."\n";
}
}
// echo '</tr></table>'."\n";
echo ''.$nbpages.'';
}



//$select = "SELECT count(id) FROM gestion_assur_vehicule WHERE validite_contrat='En cours' AND NOW() BETWEEN DATE_ADD(date_deffet, INTERVAL 305 DAY) AND DATE_ADD(date_deffet, INTERVAL 368 DAY)";
//$select = "SELECT count(id) FROM gestion_assur_vehicule WHERE validite_contrat='En cours' AND DATE_FORMAT(date_deffet, '%m-%d') > DATE_FORMAT(NOW(), '%m-%d') AND DATE_FORMAT(date_deffet, '%m-%d') < DATE_FORMAT(NOW() + INTERVAL 60 DAY, '%m-%d')";



//$select = "select * from gestion_assur_prevoyance where date_effet between '2004-01-01' and '2004-12-31' and date_resiliation between '2004-01-01' and '2004-12-31'";

//SELECT LEFT(date_effet, 4) AS annee, COUNT(*) AS nb_dossiers FROM gestion_assur_vehicule GROUP BY annee;

$select = "SELECT LEFT(date_effet, 4) AS annee, COUNT(*) AS nb_dossiers FROM gestion_assur_vehicule GROUP BY annee;";



$result = mysql_query($select,$db) or die ('Erreur : '.mysql_error() );
$row = mysql_fetch_row($result);
$total = $row[0];


//$select = "select * FROM gestion_assur_vehicule WHERE validite_contrat='En cours' AND NOW() BETWEEN DATE_ADD(date_deffet, INTERVAL 305 DAY) AND DATE_ADD(date_deffet, INTERVAL 368 DAY) ORDER BY id ASC limit $limite,$nombre";
//$select = "SELECT * FROM gestion_assur_vehicule WHERE validite_contrat='En cours' AND DATE_FORMAT(date_deffet, '%m-%d') > DATE_FORMAT(NOW(), '%m-%d') AND DATE_FORMAT(date_deffet, '%m-%d') < DATE_FORMAT(NOW() + INTERVAL 60 DAY, '%m-%d') ORDER BY DATE_FORMAT(date_deffet, '%m-%d') ASC limit $limite,$nombre";

$select = "select * from gestion_assur_prevoyance where date_effet between '2004-01-01' and '2004-12-31' and date_resiliation between '2004-01-01' and '2004-12-31' ORDER BY DATE_FORMAT(date_deffet, '%m-%d') ASC limit $limite,$nombre";



$result = mysql_query($select,$db) or die ('Erreur : '.mysql_error() );

function CompteReboursAvant($evenement)
{
$evenement = explode('-', $evenement);
// secondes entre le 1er janv. 1970 et la date de l'evenement
$evenement = (mktime(23,59,59,$evenement[1],$evenement[0],$evenement[2]));
// secondes entre le 1er janv. 1970 et aujourd'hui
$aujourdhui = time(void);
// secondes entre aujourd'hui et l'evenement
$secondes = $evenement - $aujourdhui;
// on divise pour avoir en jour(s)
$jours = $secondes / 86400;
// on arrondi à l'entier inferieur
$jours = floor($jours);
// valeur de retour de la fonction
return $jours;
}


if($total) {
// début du tableau
echo '<table bgcolor="#FFFFFF" border="1" width="986">'."\n";
// première ligne on affiche les titres prénom et surnom dans 2 colonnes
echo '<tr>';
echo '<td width="12"><p> </p></td>';
echo '<td width="190" bgcolor="#FFCC66"><b>N° de dossier client:</b></td>';
echo '<td width="80" bgcolor="#FFCC66"><p><b>Type</b></p></td>';
echo '<td width="340" bgcolor="#FFCC66"><p><b>Marque véhicule et modele</b></p></td>';
echo '<td bgcolor="#FFCC66"><p><b>Nbr de j restant</b></p></td>';
echo '<td align="right" bgcolor="#FFCC66"><p><b>Date de debut</b></p></td>';
echo '<td align="right" bgcolor="#FFCC66"><p><b>Vali Contr</b></p></td>';
echo '<td width="10"><p> </p></td>';
echo '</tr>'."\n";
// lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.
while($row = mysql_fetch_array($result)) {
echo '<tr>';
echo '<td width="12"><p> </p></td>';
echo '<td width="190"><a href="fiche_assur_vehicule.php?id='.$row['num_dos_client'].'&asa='.$row['id'].'"><b>N° dos assurance: '.$row['id'].'</b></a></td>';
echo '<td width="80"><p>'.$row['type_vehicule'].'</p></td>';
echo '<td width="340"><p>'.$row['marque_vehicule'].' '.$row['modele_vehicule'].'</p></td>';

$anaumoinun = date("Y", strtotime("-1 year"));
$event_dates = date("d-m-$anaumoinun", strtotime($row['date_deffet']));
$event_datess = date("d-m-Y", strtotime($event_dates));
$event_date = date("d-m-Y", strtotime("+1 year", strtotime($event_datess."-01" )));
//echo $event_date; afiche la date a l'endroit
$nbre_de_jours = CompteReboursAvant($event_date);

echo '<td><p><i>Il reste '.$nbre_de_jours.' jour(s)</i></p></td>';
echo '<td align="right"><p>'.$row['date_deffet'].'</p></td>';
echo '<td align="right"><p>'.$row['validite_contrat'].'</p></td>';
echo '<td width="10"><p> </p></td>';
echo '</tr>'."\n";
}
echo '</table>'."\n";












if($total > $nombre) {
?><p align="center"><?php
if($limite != 0) {
echo '<a href="'.$page.'?limite='.$limiteprecedente.'">Page précédente</a> - ';
}
else
{
echo 'Page précédente - ';
}

// affichage des liens vers les pages
$resa = $limite + $nombre;
$resb = $resa / $nombre;
echo 'page '.$resb.' / ';
affichePages($nombre,$page,$total);

// affichage des boutons


if($limitesuivante < $total) {
echo ' - <a href="'.$page.'?limite='.$limitesuivante.'">Page Suivante</a>';
}
else
{
echo ' - Page Suivante';
}
?></p><?php
}





// fin du tableau.
}
else echo 'Pas d\'enregistrements dans cette table...';

// on libère le résultat
mysql_free_result($result);
?>






</div>
</td>
</tr>
</table>
</td>
</tr>
</table>


</code>
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

j'ai modifier le code:

$select = "select * from gestion_dos_client where date_effet between '2004-01-01' and '2004-12-31' and date_resiliation between '2004-01-01' and '2004-12-31'";

reponse:
Erreur : Unknown column 'date_deffet' in 'order clause'
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

Bon j'ai créé ceci: mais n'affiche que les dossier avec la date annuel d'effet 2004
mais comment lui dire si par exemple un dossier a comme date effet 2003-06-01 et date résiliation 2009-06-01 donc dois être compté dans les année 2003, 2004, 2005, 2006, 2007, 2008, 2009 donc dan la liste dois être aussi compté



$select = "SELECT count(id) FROM gestion_assur_prevoyance WHERE LEFT(date_effet, 4) = 2004";



$result = mysql_query($select,$db) or die ('Erreur : '.mysql_error() );

$row = mysql_fetch_row($result);

$total = $row[0];




$select = "select * FROM gestion_assur_prevoyance WHERE LEFT(date_effet, 4) = 2004 ORDER BY id ASC limit $limite,$nombre";

$result = mysql_query($select,$db) or die ('Erreur : '.mysql_error() );
Messages postés
28190
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
25 février 2020
5 958
Salut,

Peut être

select   LEFT(date_effet, 4), count(*) FROM gestion_assur_prevoyance 
GROUP BY LEFT(date_effet, 4)


Pour ton problème de gestion de l'intervalle date début/fin on revient à la remarque qui t'a été faite plusieurs fois, il faut utiliser des champs de type date qui possèdent des opérateurs spécialisés.


cdlt
        Un étranger, c'est un ami qu'on n'a pas encore rencontré.
Messages postés
9
Date d'inscription
dimanche 2 mars 2014
Statut
Membre
Dernière intervention
9 mars 2014

je ne peux pas modifier en type date car d'autre fonction sont calculer en mode varchar dessus