Partage
  • Partager sur Facebook
  • Partager sur Twitter

[MySQL 5.7] Requête différence entre 2 dates

Avec plusieurs critère

    16 avril 2021 à 13:08:29

    :(

    Donc c'est bien côté SQL ... mais alors ... chelou ... on est bien sur la même base de données ? Pas deux bases différentes ?

    Essaye en forçant les alias de table, comme ceci :

    SELECT IF(
    		D.username = @nom_precedent
    		AND DATE( D.dates ) = @jour_precedent,
    		TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
    		'0'
    	) AS resultat,
    	D.tache,
    	D.id,
    	D.etat,
    	A.nomaffaire,
    	@jour_precedent := DATE( D.dates ) AS jour,
    	@date_precedente := D.dates AS dates,
    	@nom_precedent := D.username AS username
    FROM
    	( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) AS tmp,
    	declaration D
    		INNER JOIN affaires A
    			ON D.id_affaires = A.id
    WHERE
    	D.username = ?
    	AND YEAR( D.dates ) = YEAR(NOW())
    	AND WEEK( D.dates ) = WEEK(NOW())
    ORDER BY
    	D.username,
    	D.dates DESC
    • Partager sur Facebook
    • Partager sur Twitter
    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
      16 avril 2021 à 13:12:32

      Oui c'est bien la même base et le résultat est le même avec les alias

      Je ne vois vraiment pas de quoi cela peut venir

      d'un sens je me dis que ma question n'étais pas inutile ^^ 

      • Partager sur Facebook
      • Partager sur Twitter
        16 avril 2021 à 13:25:07

        J'imagine que la jointure doit modifier l'ordre des données avant le calcul des variables ... je n'avais jamais vu ça ...

        Essaye ceci pour voir :

        SELECT
        	IF(
        		D.username = @nom_precedent
        		AND DATE( D.dates ) = @jour_precedent,
        		TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
        		'0'
        	) AS resultat,
        	D.tache,
        	D.id,
        	D.etat,
        	D.nomaffaire,
        	@jour_precedent := DATE( D.dates ) AS jour,
        	@date_precedente := D.dates AS dates,
        	@nom_precedent := D.username AS username
        FROM
        	( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) T,
        	(
        		SELECT
        			D.tache,
        			D.id,
        			D.etat,
        			A.nomaffaire,
        			D.dates,
        			D.username
        		FROM
        			declaration D
        				INNER JOIN affaires A
        					ON D.id_affaires = A.id
        		WHERE
        			D.username = ?
        			AND YEAR( D.dates ) = YEAR(NOW())
        			AND WEEK( D.dates ) = WEEK(NOW())
        		ORDER BY
        			D.username,
        			D.dates DESC
        	) D

        -
        Edité par Benzouye 16 avril 2021 à 14:27:30

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
          16 avril 2021 à 14:23:46

          j'ai une petite erreur 

          PHP Fatal error:  Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'A.nomaffaire' in 'field list' in C:\inetpub\wwwroot\chantier_socopa\pages\suivisemaine.php:82
          Stack trace:
          #0 C:\inetpub\wwwroot\chantier_socopa\pages\suivisemaine.php(82): PDOStatement->execute()
          #1 C:\inetpub\wwwroot\chantier_socopa\index.php(26): include('...')
          #2 {main}
            thrown in C:\inetpub\wwwroot\chantier_socopa\pages\suivisemaine.php on line 82



          • Partager sur Facebook
          • Partager sur Twitter
            16 avril 2021 à 14:27:20

            Oui, faute de copier/coller de ma part ... tu aurais pu comprendre par toi même :p

            Ligne 11 de mon message précédent, que je viens de modifier ...

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              16 avril 2021 à 14:33:26

              Du coup j'avais essayé et j'avais quand même un problème en résultat donc je pensais que je m'y prenais mal

              Mais j'ai donc bien ce problème du coup

              Le tri n'est plus le même 

              -
              Edité par Lecorsiau88 16 avril 2021 à 14:35:45

              • Partager sur Facebook
              • Partager sur Twitter
                16 avril 2021 à 14:44:25

                Donc en le rajoutant ça devrait le faire :

                SELECT
                	IF(
                		D.username = @nom_precedent
                		AND DATE( D.dates ) = @jour_precedent,
                		TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
                		'0'
                	) AS resultat,
                	D.tache,
                	D.id,
                	D.etat,
                	D.nomaffaire,
                	@jour_precedent := DATE( D.dates ) AS jour,
                	@date_precedente := D.dates AS dates,
                	@nom_precedent := D.username AS username
                FROM
                	( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) T,
                	(
                		SELECT
                			D.tache,
                			D.id,
                			D.etat,
                			A.nomaffaire,
                			D.dates,
                			D.username
                		FROM
                			declaration D
                				INNER JOIN affaires A
                					ON D.id_affaires = A.id
                		WHERE
                			D.username = ?
                			AND YEAR( D.dates ) = YEAR(NOW())
                			AND WEEK( D.dates ) = WEEK(NOW())
                	) D
                ORDER BY
                	D.username,
                	D.dates DESC
                • Partager sur Facebook
                • Partager sur Twitter
                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                  16 avril 2021 à 15:22:45

                  Arf tu est allez plus vite que moi ^^ 

                  j'ai bien testé aussi cette solution et voila le résultat : 


                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 avril 2021 à 15:49:23

                    Bon ... je ne sais plus trop quoi dire ...

                    Il faudrait vérifier ce qu'il se passe au niveau des variables de session.

                    Peux-tu poster le retour PHPMyAdmin de ces deux requêtes :

                    SELECT
                    	@nom_precedent,
                    	@jour_precedent,
                    	@date_precedente,
                    	IF(
                            D.username = @nom_precedent
                            AND DATE( D.dates ) = @jour_precedent,
                            TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
                            '0'
                        ) AS resultat,
                        D.tache,
                        D.id,
                        D.etat,
                        D.id_affaires,
                        @jour_precedent := DATE( D.dates ) AS jour,
                        @date_precedente := D.dates AS dates,
                        @nom_precedent := D.username AS username
                    FROM
                        ( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) AS tmp,
                        declaration D
                    WHERE
                        D.username = ?
                        AND YEAR( D.dates ) = YEAR(NOW())
                        AND WEEK( D.dates ) = WEEK(NOW())
                    ORDER BY
                        D.username,
                        D.dates DESC
                    SELECT
                    	@nom_precedent,
                    	@jour_precedent,
                    	@date_precedente,
                    	IF(
                            D.username = @nom_precedent
                            AND DATE( D.dates ) = @jour_precedent,
                            TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
                            '0'
                        ) AS resultat,
                        D.tache,
                        D.id,
                        D.etat,
                        A.nomaffaire,
                        @jour_precedent := DATE( D.dates ) AS jour,
                        @date_precedente := D.dates AS dates,
                        @nom_precedent := D.username AS username
                    FROM
                        ( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) AS tmp,
                        declaration D
                            INNER JOIN affaires A
                                ON D.id_affaires = A.id
                    WHERE
                        D.username = ?
                        AND YEAR( D.dates ) = YEAR(NOW())
                        AND WEEK( D.dates ) = WEEK(NOW())
                    ORDER BY
                        D.username,
                        D.dates DESC
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                      16 avril 2021 à 15:54:39

                      Merci du temps que vous m'accordez :) 

                      Donc pour la première requête : 

                      Et la deuxième:

                      Du coup il y a une différence sur les dates précédentes

                      -
                      Edité par Lecorsiau88 16 avril 2021 à 16:01:02

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 avril 2021 à 16:47:02

                        Après deux/trois lectures sur le net, je trouve des posts qui disent que l'ordre n'est pas réellement défini par MySQL avant ou après l'évaluation des variables ...

                        Je pense donc que le plus sécurisant serait de faire le calcul côté PHP ...

                        Un truc du genre :

                        <?php
                        	$bdd =new PDO( ... );
                        	
                        	$requete = $bdd->prepare( '
                        		SELECT
                        			D.tache,
                        			D.id,
                        			D.etat,
                        			A.nomaffaire,
                        			D.dates,
                        			D.username
                        		FROM
                        			declaration D
                        				INNER JOIN affaires A
                        					ON D.id_affaires = A.id
                        		WHERE
                        			D.username = ?
                        			AND YEAR( D.dates ) = YEAR(NOW())
                        			AND WEEK( D.dates ) = WEEK(NOW())
                        		ORDER BY
                        			D.username,
                        			D.dates DESC'
                        	);
                        	$requete->execute( array( $username ) );
                        	$donnees = $requete->fetchAll();
                        	$requete->closeCursor();
                        	
                        	if( count( $donnees ) > 0 ) {
                        ?>
                        		<table>
                        			<thead>
                        				<tr>
                        					<th>ID</th>
                        					<th>Date</th>
                        					<th>Username</th>
                        					<th>Affaires</th>
                        					<th>Tache</th>
                        					<th>Temps</th>
                        				</tr>
                        			</thead>
                        			<tbody>
                        <?php
                        		$userPrecedent = '';
                        		$jourPrecedent = '';
                        		$datePrecedent = '';
                        		foreach( $donnees as $ligne ) {
                        			switch( $ligne['etat'] ) {
                        				case 0:
                        					$classeEtat = 'table-danger';
                        					break;
                        				case 1:
                        					$classeEtat = 'table-warning';
                        					break;
                        				case 2:
                        					$classeEtat = 'table-success';
                        					break;
                        				default:
                        					$classeEtat = '';
                        					break;
                        			}
                        			
                        			$dateTimeActuel = DateTime::createFromFormat( 'Y-m-d H:i:s', $ligne['dates'] );
                        			$dateTimePrecedent = DateTime::createFromFormat( 'Y-m-d H:i:s', $datePrecedent );
                        			
                        			if( $ligne['username'] == $userPrecedent && $dateTime->format('Y-m-d') == $jourPrecedent ) {
                        				$difference = $dateTimeActuel->diff( $dateTimePrecedent );
                        				$resultat = $difference->format( 'H:i:s' );
                        			} else {
                        				$resultat = '00:00:00';
                        			}
                        ?>
                        				<tr class="<?= $classeEtat ;?>">
                        					<td scope="row"><?= $ligne['dates'] ;?></td>
                        					<td><?= $ligne['dates'] ;?></td>
                        					<td><?= $ligne['username'] ;?></td>
                        					<td><?= $ligne['nomaffaire'] ;?></td>
                        					<td><?= $ligne['tache'] ;?></td>
                        					<td><?= $resultat; ?></td>
                        				</tr>
                        <?php
                        			$userPrecedent = $ligne['username'];
                        			$jourPrecedent = $dateTime->format('Y-m-d');
                        			$datePrecedent = $dateTime->format('Y-m-d H:i:s');
                        		}
                        ?>
                        			</tbody>
                        		</table>
                        <?php
                        	} else {
                        ?>
                        		<p>Aucune données.</p>
                        <?php
                        	}
                        ?>
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          23 avril 2021 à 15:06:28

                          As-tu essayé ce code PHP ?

                          De mon côté j'ai testé le SQL et je rencontre le même problème dès ajout de la jointure ...

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                            27 avril 2021 à 9:55:14

                            Alors j'ai fais quelque test mais  j'ai toujours un problème il ne me sort aucune donnée de la requête je ne comprend pas bien pourquoi 

                            je cherche encore pour le moment :)

                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juillet 2021 à 10:26:12

                              Bonjour désole pour le déterrage de sujet, j'essai de me remettre sur le sql

                              après plusieurs essais je n'arrive toujours pas à comprendre pourquoi ca ne fonctionne pas.

                              SELECT
                                  @nom_precedent,
                                  @jour_precedent,
                                  @date_precedente,
                                  IF(
                                      D.id_poseurs = @nom_precedent
                                      AND DATE( D.dates ) = @jour_precedent,
                                      TIME_TO_SEC( TIMEDIFF( @date_precedente, D.dates) ),
                                      '0'
                                  ) AS resultat,
                                  D.id_taches,
                                  D.id,
                                  D.etat,
                                  A.nomaffaire,
                                  @jour_precedent := DATE( D.dates ) AS jour,
                                  @date_precedente := D.dates AS dates,
                                  @nom_precedent := D.id_poseurs AS username 
                              FROM
                                  ( SELECT @nom_precedent := '', @jour_precedent := '', @date_precedente := '' ) AS tmp,
                                  declaration D
                                      INNER JOIN affaires A
                                          ON D.id_affaires = A.id
                                        		INNER JOIN taches E
                                          		ON D.id_taches = E.id
                              WHERE D.id_poseurs = 2
                                  AND YEAR( D.dates ) = YEAR(NOW())
                                  AND WEEK( D.dates ) = WEEK(NOW())
                              ORDER BY
                                  D.id_poseurs,
                                  D.dates desc;

                              Avec cette formule l'ensemble fonctionne correctement :

                              Par contre si je passe le D.id_taches en E.tache les nom des taches apparaissent bien mais les calculs ne sont plus juste.

                              J'arrive pas à comprendre comment c'est possible

                              -
                              Edité par Lecorsiau88 10 juillet 2021 à 10:30:10

                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 juillet 2021 à 10:38:36

                                Benzouye a écrit:

                                Après deux/trois lectures sur le net, je trouve des posts qui disent que l'ordre n'est pas réellement défini par MySQL avant ou après l'évaluation des variables ...

                                Je pense donc que le plus sécurisant serait de faire le calcul côté PHP ...

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                                [MySQL 5.7] Requête différence entre 2 dates

                                × 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