Du...au...

Résolu
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008 - 3 mars 2008 à 16:44
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008 - 5 mars 2008 à 11:08
Bonjour,

Et voilà encore une nouvelle colle (enfin la ma tête me crit "arrête de me faire soufrir" )

Voilà le problème, j'ai ma table arret qui se présente sous cette forme :

     arret
-----------
numero_arret
numero_personne
date_arret               ---->date sous forme aaaa-mm-jj

Je souhaite pouvoir afficher les arrêts (jusque là je n'ai pas de problème ouf!! c'est après que ça se complique),
j'aimerai pouvoir afficher des périodes (des dates qui se suivent dans mon champ "date_arret") sous la forme "du....au...." , sans écrire les dates intermédiaires.

J'ai un début de code mais je ne sais pas si c'est ce qu'il faut :

             //je sélectionne les arrets d'une personne sélectionné précédemment
$select_date_arret="SELECT date_arret FROM arret WHERE numero_personne="".$_POST['nom']."" ORDER BY date_arret";

            //je fait ma requète SQL (tant qu'il y a des arrets correspondant à la personne sélectionnée)
$resultatArret2 = mysql_query($select_date_arret);
while ($donneeSuite = mysql_fetch_object($resultatArret2))
{
       list($annee, $mois, $jour ) = explode('-', $select_date_arret);
       $timestamp1 = mktime(0,0,0,$mois,$jour,$annee);
       if (strtotime("+1 day",""$annee""-""$mois""-""$jour"")== $donneeSuite->date_arret)
              //ça c'est complètement faux (je pense ) mais ca donne un apercu
           {
               .....
           }
}

Merci d'avance pour vos réponses

14 réponses

MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
4 mars 2008 à 13:37
Je ne peux malheureusement pas continuer à t'aider, ( j'ai une big réunion qui m'attend).
mais : ( conseils )
1) Ecrit une fonction du style diffDate( $strDate1 , $strDate2) qui retournerai le nombre de jour entre deux dates sous format 2008-01-01. (ca doit exister !) Sinon, fait appel au forum. Teste ta fonction avant de l'utiliser.

2)Reprends ton idée premiere ( avec un while )



$select_date_arret="SELECT date_arret FROM arret WHERE numero_personne="".$_POST['nom']."" ORDER BY date_arret";

3) travaille avec deux variables $debut , $fin. qui au départ sont vides

4)  et dans ton while, tu auras un test du genre
...
if ( diffDate(  $fin , $donneeSuite->date_arret ) > 1 ) {
         // $debut et $fin sont exploitables
            ...

         // réaffectation
         $debut =  $donneeSuite->date_arret  ;
         $fin = $debut ;   
     } else {
        // poursuite de la recherche de la fin: 
        $fin = $donneeSuite->date_arret ;
    }

5), pense à la sortie (lorsque le while est fini) , sinon tu oublieras la dernière période.

C'est une idée qui'il te faudra retravailler bien sur. ( abuse des echo pour le debug )

Bon boulot !
3
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
5 mars 2008 à 09:58
Bonjour,

j'ai enfin réussi a faire se que je voulais... C'était laborieux mdr.
Voici le code, ça peut toujours servir à quelqu'un :

<?php
   //initialisation de mes variables
   
    $fin='1970-01-01';
    $premiere_pass=true;
    $date_arret_seul=true;
    
   //requete sql pour selectionner les arret d'une personne
   
    $select_date_arret="SELECT date_arret FROM arret WHERE numero_personne='19' ORDER BY date_arret";
    $resultat_date_arret = mysql_query($select_date_arret);
    while ($donnees_arret = mysql_fetch_object($resultat_date_arret))
    {
    
   //requete sql pour faire la difference entre 2 jours 
    
     $difference='SELECT TIMESTAMPDIFF( DAY,\''.$fin.'\', \''.$donnees_arret->date_arret.'\' )as resultat';
     $resultat_difference = mysql_query($difference);
     while ($donnees_resultat = mysql_fetch_object($resultat_difference))
     {
     
   //verification si les deux jours se suivent et si c'est la première date de la période
   
      if ( $donnees_resultat->resultat == 1 && $premiere_pass==true)
      {
       $debut = $fin   ;
       $fin = $donnees_arret->date_arret ;
       $date_arret_seul=false;
       $premiere_pass=false;
      }
      
   //verification si les deux jours se suivent et si ce n'est pas la première date de la période
   
      elseif( $donnees_resultat->resultat == 1 && $premiere_pass==false)
      {
       $fin = $donnees_arret->date_arret ;
       $premiere_pass=false;
       $date_arret_seul=false;
      }
      
   //fin de la vérification des jours d'une période et afficher "du...au..."
   
      elseif( $donnees_resultat->resultat > 1 && $date_arret_seul==false)
      {
       echo ('du '.$debut.' au '.$fin.'

');
       $fin = $donnees_arret->date_arret ;
       $premiere_pass=true;
       $date_arret_seul=true;
      }
      
   //vérification si c'est un jour seul 
   
      elseif( $donnees_resultat->resultat > 1 && $date_arret_seul==true) 
      {
      
      //si c'est la valeur d'initialisation, ne rien faire
      
       if ($fin=='1970-01-01')
       {
        $fin = $donnees_arret->date_arret ;
        $premiere_pass=true;
        $date_arret_seul=true;
       
       }
       
      //sinon afficher "le..."
      
       else
       {
        echo ('le '.$fin.'

');
        $fin = $donnees_arret->date_arret ;
        $premiere_pass=true;
        $date_arret_seul=true;
       }
      }
     } 
    }
    
    
    
    
    
    ?>


 


 


Merci encore à toi MasterCent pour m'avoir aiguillé
3
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
4 mars 2008 à 09:01
Salut,

J'ai pas très bien compris ton problème !
1/ Table ARRET : primary Key est Numero Arret ? , y a t-il une même personne qui s'arrete plusieurs fois ?

2/ est-il possible d'obtenir une requete qui par personne donne la date la plus petite ?
SELECT numero_personne , min ( date_arret ) from ARRET where ... GROUP BY numero_personne
Dans le même ordre d'idée, la fonction max pourrait donner  la dernière.

3/ soit une requête UNION (mais j'avoue ne plus me souvenir  si elle fonctionne sous MySQL ) , soit deux requetes consecutives et le tour me semble joué ?

A moins que je n'ai pas tout compris à ton problème ?

PS, si tu veux travailler par mois ou par année, il y a moyen de rajouter un champ calculé dans le SQL.
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
4 mars 2008 à 11:15
Bonjour,

la primary key est bien numero_arret.

En fait les arrets se présentent sous la forme suivante (je fais seulement pour une personne) :

2007-05-12
2007-05-13
2007-05-14
2007-05-15
2007-05-16

2007-10-05
2007-10-06
2007-10-07
2007-10-08
2007-10-09
2007-10-10
2007-10-11

Ce que j'aimerai avoir comme résultat c'est :

du 2007-05-12 au 2007-05-16
du 2007-10-05 au 2007-10-11

Je ne sais pas si c'est possible. Merci de m'aider.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
4 mars 2008 à 11:35
Essaye ça :

SELECTCONCAT(month(date_arret),'-',year( date_arret))ASPERIODE,
min( date_arret)  , max(date_arret)
FROM`arret`
WHERE ...
GROUPBYPERIODE
LIMIT0,30

 (attention pas d'espace après CONCAT : j'ai déjà eu des bugs... )
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
4 mars 2008 à 12:07
J'ai fait ca :


SELECT CONCAT( month( date_arret ) , '-', year( date_arret ) ) ASPERIODE, min( date_arret ) , max( date_arret )
FROM `arret`
WHERE numero_personne = '19'
GROUP BY ASPERIODE

le problème c'est que quand un arret va par exemple du 25/05/2007 au 05/06/2007, il m'affiche 2 périodes :
du 25/05/2007 au 31/05/2007
du 01/06/2007 au 05/06/2007

je pense que c'est le ASPERIODE dans le GROUP BY qui ne va pas, j'ai essayé PERIODE mais sql ne l'accepte pas

Merci pour l'aide.
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
4 mars 2008 à 12:14
C'est bon j'ai trouvé il faut faire :





SELECT
CONCAT
(
year
(
date_arret
)
)
ASPERIODE
,
min
(
date_arret
)
,
max
(
date_arret
)


FROM
`arret`


WHERE
numero_personne
=
'19'


GROUP
BY
ASPERIODE

Voilà MERCI pour tout MasterCent !!!!!!!
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
4 mars 2008 à 12:17
En fait ca fait n'importe quoi, j'avais pas essayer de mettre plusieur arrêt dans une même anné

Help please !
0
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
4 mars 2008 à 12:21
Pas ASPERIODE , mais bien as PERIODE en deux mots,
group by PERIODE
. Autant pour moi !

Par contre, à la lecture de ta réaction, il semble que ton traitement soit différent que ce que je pensais !

En effet, qu'est ce qu'une période : SQL te donnera un resultat basé sur la date dans le temps.
( une semaine; un mois, une année, un trimestre,... ). Il s'agit d'une compression.

Tu sembles vouloir le début et la fin d'une Période selon le fait que les arrets se suivent de jours en jours, indépendement du mois, de l'année. Nous sommes alors en présence d'un traitement Itératif (c'est à dire dont le résultat dépend de la ligne précédente). Si ton idée est celle-là, alors, il faudra recourir à du code PHP.

Peux tu préciser ce que tu entends par période ?
2008-02-29 : debut
2008-03-01
2008-03-02 : fin, car pas d'arret le lendemain ...
2008-03-05 : debut, car il n'y a pas eu d'arret la veille
etc...

Est-ce cela ?
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
4 mars 2008 à 12:32
C'est tout à fait cela mais le problème c'est que l'on peut rajouter une date 1 mois après avoir entré une période, je m'explique dans ma table "arret", on a des dates qui sont enregistrées de la façon suivante :

numero_arret |   date_arret
-----------------------------
                     |
1                     2007-05-12
2                     2007-05-13
3                     2007-05-14
4                     2007-05-15
5                     2007-05-16
6                     2007-10-05
7                     2007-10-06
8                     2007-10-07
9                     2007-10-08
10                   2007-10-09
11                   2007-10-10
12                   2007-10-11

Mais elles peuvent très bien être enregistrées de la façon suivante :

1                     2007-10-07
2                     2007-05-13
3                     2007-10-09
4                     2007-05-15
5                     2007-05-16
6                     2007-10-05
7                     2007-10-06
8                     2007-05-12
9                     2007-10-08
10                   2007-10-10
11                   2007-05-14
12                   2007-10-11
 
Je ne peux pas donc faire de lien avec les lignes qui se suivent...
C'est compliqué quand même....

Merci
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
5 mars 2008 à 10:02
Encore une petite dernière question, je ne sais pas comment faire la parit 5) de MasterCent, à savoir écrire du code à la sortie de mon while pour ne pas oublier la dernière valeur.
Quelqu'un pourrait il m'aider?

Merci
0
MasterCent Messages postés 83 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 14 décembre 2011 1
5 mars 2008 à 10:49
De rien pour les explications,
 
l'étape 5, c'est en fait de te demander ce que tu fais de tes variables...


En réalité, cela consiste à écrire un truc du genre       
 echo ('du '.$debut.' au '.$fin.'

');

Puisqu'en principe, cette période n'a pas encore été écrite !

Très bien les commentaires qui explique ce que tu fais. C'est capital !

...
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
5 mars 2008 à 11:06
je n'arrive pas à trouver ou je doit mettre l'echo... Une petite idée?

Merci
0
rouskard Messages postés 26 Date d'inscription mardi 26 février 2008 Statut Membre Dernière intervention 17 mars 2008
5 mars 2008 à 11:08
Le seul moyen que j'ai trouvé c'est d'insérer un arret à une date très très lointaine genre 2150-01-01.
0
Rejoignez-nous