Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL - Sélectionner date et date précédente

Sujet résolu
    21 septembre 2017 à 20:35:46

    Bonsoir,

    J'affiche un tableau ainsi grâce à la requête qui suit :

    id --- date_intervention --- date_intervention_precedente

    3 ---      2017-09-10    ---       2017-07-28

    2 ---      2017-07-28    ---       2017-06-12

    1 ---     2017-06-12    ---        2017-05-03

    SELECT id, date_intervention FROM intervention ORDER BY date_intervention DESC

    Mais comme vous le constatez, je ne sais pas trouver dans cette requête "date_intervention_precedente"

    Ma table est ainsi :

    id - date_intervention

    1 ---     2017-06-12

    2 ---      2017-07-28

    3 ---      2017-09-10

    Si l'un de vous a une excellente idée, je prends !!

    Merci d'avance

    -
    Edité par BenoîtDESCOURS 21 septembre 2017 à 20:40:05

    • Partager sur Facebook
    • Partager sur Twitter
      22 septembre 2017 à 8:59:07

      Bonjour,

      Par simplicité, il serait plus facile de faire ce traitement côté applicatif (PHP ?).

      Par ailleurs, tu ne peux pas déterminer la date précédente pour la première intervention ...

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        22 septembre 2017 à 13:08:50

        Benzouye a écrit:

        Par simplicité, il serait plus facile de faire ce traitement côté applicatif (PHP ?).

        Je suis aussi de l'avis de Benzouye, ça sera plus facile à traiter du côté de ton application.

        Si t'es en PHP,, tu récupère ta date avec un SELECT.

        Et tu reconstruis une date à partir de celle récupérée, tout en enlevant un jour (24*3600 pour le timestamp).

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2017 à 22:05:51

          Bonjour,

          Le problème, et je ne sais pas si cela en est un, c'est que je suis dans un boucle...

          $query=$bdd->prepare('SELECT id, date_intervention FROM intervention ORDER BY date_intervention DESC')or die(print_r($bdd->errorInfo()));
          $query->execute();
          $i='1';
          while ($data_intervention=$query->fetch())
          {
          	$query=$bdd->prepare('SELECT id, date_intervention FROM intervention WHERE date_intervention < "'.$data_intervention['date_intervention'].'" ORDER BY date_intervention DESC LIMIT 1')or die(print_r($bdd->errorInfo()));
          	$query->execute();
          	$data_intervention_prec=$query->fetch();
          					
          if(isset($data_intervention_prec['date_intervention'])) {
          	$data_duree = $data_intervention_prec['date_intervention'];
          }
          else {
          	$data_duree = "";
          }			
          



          J'arrive à afficher la date et la date précédente mais ma boucle ne me retourne qu'une seule ligne...

          Je traite l'abasence de date antérieure avec le if isset

          Voilà où j'en suis.


          -
          Edité par BenoîtDESCOURS 22 septembre 2017 à 22:48:04

          • Partager sur Facebook
          • Partager sur Twitter
            25 septembre 2017 à 9:07:07

            Il ne faut pas fetch dans la boucle, sinon tu perds des lignes ... Il suffit huste de mémoriser la date de l'intervention à la fin de la boucle pour l'utiliser dans l'itération suivante ...

            Exemple :

            <?php
            	$query = $bdd->query('
            		SELECT id, date_intervention
            		FROM intervention
            		ORDER BY date_intervention DESC'
            	) or die( print_r( $bdd->errorInfo() ) );
            	
            	$datePrecedente = '';
            ?>
            	<table>
            		<thead>
            			<tr>
            				<th>Date intervention</th>
            				<th>ID</th>
            				<th>Date précédente</th>
            			</tr>
            		</thead>
            		<tbody>
            <?php
            	while( $row = $query->fetch() ) {
            ?>		
            			<tr>
            				<td><?php echo $row['date_intervention']; ?></td>
            				<td><?php echo $row['id']; ?></td>
            				<td><?php echo $datePrecedente; ?></td>
            			</tr>
            <?php	
            		// On mémorise la date de cette ligne
            		$datePrecedente = $row['date_intervention']
            	}
            ?>
            		<tbody>
            	</table>

            -
            Edité par Benzouye 25 septembre 2017 à 9:07:27

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              25 septembre 2017 à 16:44:56

              Du coup en renommant ma 2ème requête $query devient $query2, tout roule...

              Qu'en penses tu ?

              $query=$bdd->prepare('SELECT id, date_intervention FROM intervention ORDER BY date_intervention DESC')or die(print_r($bdd->errorInfo()));
              $query->execute();
              $i='1';
              while ($data_intervention=$query->fetch())
              {
                  $query2=$bdd->prepare('SELECT id, date_intervention FROM intervention WHERE date_intervention < "'.$data_intervention['date_intervention'].'" ORDER BY date_intervention DESC LIMIT 1')or die(print_r($bdd->errorInfo()));
                  $query2->execute();
                  $data_intervention_prec=$query2->fetch();
                                   
              if(isset($data_intervention_prec['date_intervention'])) {
                  $data_duree = $data_intervention_prec['date_intervention'];
              }
              else {
                  $data_duree = "";
              }          



              • Partager sur Facebook
              • Partager sur Twitter
                25 septembre 2017 à 16:57:09

                Ne jamais faire de requête au sein d'une boucle (sauf absolue nécessité et c'est rare) !!! Si tu as 200 interventions remontées dans la première requête, alors tu vas exécuter 200 fois la requête dans la boucle !!! Tu peux mettre ton serveur à genoux ... Imagine que 10 personnes ouvre cette page en même temps ... bim ! 2000 requêtes simultanées !

                Mon code est largement suffisant ... et fonctionnel ... regarde-le, comprend-le et utilise-le ...

                -
                Edité par Benzouye 25 septembre 2017 à 16:57:18

                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  25 septembre 2017 à 20:03:44

                  Et bien là, ça m'a l'air pas mal.

                  Si tu veux/peux jeter un œil si rein ne cloche mais ça a l'air de bien fonctionné.

                  Merci de ton aide précieuse.

                  <tbody>
                  <?php
                  $query=$bdd->prepare('SELECT id_convoyeur, changement_bande, MAX(date_intervention) AS max_date_intervention FROM intervention WHERE changement_bande="Oui" AND id_convoyeur = '.$convoyeur_id.'')or die(print_r($bdd->errorInfo()));
                  $query->execute();				$max_date=$query->fetch();
                  			
                  $query=$bdd->prepare('SELECT id, id_convoyeur, date_intervention, DATE_FORMAT(date_intervention,\'%d-%m-%Y\') AS date_intervention_fr, intervention_qui, intervenant, conv_presta, intervention_temps,  intervention_cout, changement_bande, fabriquant, gamme, matiere, nomenclature
                  FROM intervention WHERE id_convoyeur='.$convoyeur_id.' AND changement_bande="Oui" ORDER BY date_intervention DESC')or die(print_r($bdd->errorInfo()));
                  $query->execute();
                  $datePrecedente = '';
                  					
                  while ($data_intervention=$query->fetch())
                  {
                  	if ($max_date['max_date_intervention'] == $data_intervention['date_intervention']) {
                  	$date_1 = strtotime(date('Y-m-d'));
                  	$date_2 = strtotime($data_intervention['date_intervention']);
                  	$nbJoursTimestamp = $date_1-$date_2;	
                  	$nbJours = $nbJoursTimestamp/86400 .' (en cours)';	
                  	}
                  	else {
                  	$date_1 = strtotime($datePrecedente);
                  	$date_2 = strtotime($data_intervention['date_intervention']);
                  	$nbJoursTimestamp = $date_1-$date_2;	
                  	$nbJours = $nbJoursTimestamp/86400;				
                  	}
                  ?>
                  <tr onclick="window.location.href='intervention/fiche_intervention.php?intervention_id=<?php echo $data_intervention['id'];?>'" name="ligne">
                  	<td><div style="width:90px;"><?php echo ($data_intervention['date_intervention_fr']);?></div></td>
                  	<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['fabriquant'], 30);?></div></td>
                  	<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['gamme'], 30);?></div></td>
                  	<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['matiere'], 30);?></div></td>
                  	<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['nomenclature'], 30);?></div></td>
                  	<td><div style="width:140px;"><?php echo $nbJours;?></div></td>
                  	<td><div style="width:213px;"><?php echo CoupePhrase($data_intervention['intervenant'], 30);?></div></td>
                  </tr>
                  <?php
                  // On mémorise la date de cette ligne
                  $datePrecedente = $data_intervention['date_intervention'];
                  }
                  ?>
                  </tbody>



                  -
                  Edité par BenoîtDESCOURS 25 septembre 2017 à 20:04:24

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 septembre 2017 à 8:47:03

                    A utiliser prepare, autant l'utiliser correctement ... Les requêtes préparées servent à ça ...

                    Tu peux également simplifier ta première requête et son traitement avec fetchColumn, pour récupérer directement la date voulue.

                    Le code devient :

                    <tbody>
                    <?php
                    $query=$bdd->prepare('
                    	SELECT MAX(date_intervention)
                    	FROM intervention
                    	WHERE
                    		changement_bande="Oui"
                    		AND id_convoyeur = ?');
                    $query->execute( array( $convoyeur_id ) );
                    $max_date=$query->fetchColumn();
                    $query->closeCursor();
                    			 
                    $query=$bdd->prepare('
                    	SELECT
                    		id,
                    		id_convoyeur,
                    		date_intervention,
                    		DATE_FORMAT(date_intervention,\'%d-%m-%Y\') AS date_intervention_fr,
                    		intervention_qui,
                    		intervenant,
                    		conv_presta,
                    		intervention_temps,
                    		intervention_cout,
                    		changement_bande,
                    		fabriquant, gamme,
                    		matiere,
                    		nomenclature
                    	FROM intervention
                    	WHERE
                    		id_convoyeur= ?
                    		AND changement_bande="Oui"
                    	ORDER BY date_intervention DESC'
                    );
                    $query->execute( array( $convoyeur_id ) );
                    
                    $datePrecedente = '';					 
                    while( $data_intervention = $query->fetch() ) {
                    	if( $max_date == $data_intervention['date_intervention'] ) {
                    		$date_1 = strtotime( date('Y-m-d') );
                    		$date_2 = strtotime( $data_intervention['date_intervention'] );
                    		$nbJoursTimestamp = $date_1-$date_2;   
                    		$nbJours = $nbJoursTimestamp/86400 .' (en cours)'; 
                    	} else {
                    		$date_1 = strtotime($datePrecedente);
                    		$date_2 = strtotime($data_intervention['date_intervention']);
                    		$nbJoursTimestamp = $date_1-$date_2;   
                    		$nbJours = $nbJoursTimestamp/86400;			
                    	}
                    ?>
                    	<tr onclick="window.location.href='intervention/fiche_intervention.php?intervention_id=<?php echo $data_intervention['id'];?>'" name="ligne">
                    		<td><div style="width:90px;"><?php echo ($data_intervention['date_intervention_fr']);?></div></td>
                    		<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['fabriquant'], 30);?></div></td>
                    		<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['gamme'], 30);?></div></td>
                    		<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['matiere'], 30);?></div></td>
                    		<td><div style="width:170px;"><?php echo CoupePhrase($data_intervention['nomenclature'], 30);?></div></td>
                    		<td><div style="width:140px;"><?php echo $nbJours;?></div></td>
                    		<td><div style="width:213px;"><?php echo CoupePhrase($data_intervention['intervenant'], 30);?></div></td>
                    	</tr>
                    <?php
                    	// On mémorise la date de cette ligne
                    	$datePrecedente = $data_intervention['date_intervention'];
                    }
                    $query->closeCursor();
                    ?>
                    </tbody>
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                    SQL - Sélectionner date et date précédente

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown