Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cette requête SQL est-elle bonne ?

    20 mai 2019 à 15:51:17

    Bonjour,
    J'ai fait une requête SQL permettant de récupérer les numéros de séries :
    - des pc Dell
    -dont la date de modification remonte a au maximum 1 an
    -dont le statut est actif, neuf, en stock, pret ou en pret
    -et dont la date de garantie a expiré au maximum 3 mois.

    Voici ma requête :
    SELECT glpi_computers.serial, DATE_ADD(glpi_infocoms.warranty_date,INTERVAL glpi_infocoms.warranty_duration                 MONTH) AS FIN_GARANTIE

                FROM glpi_computers

                JOIN glpi_manufacturers on glpi_manufacturers.id=glpi_computers.manufacturers_id

                JOIN glpi_infocoms ON glpi_infocoms.itemtype="Computer" AND glpi_infocoms.items_id=glpi_computers.id

                WHERE glpi_computers.states_id in (1,2,5,7,9)

                AND glpi_computers.date_mod>DATE_ADD(now(), INTERVAL -366 DAY)

                AND UPPER(glpi_manufacturers.name) LIKE ("DELL%" )

                AND DATE_ADD(glpi_infocoms.warranty_date,INTERVAL glpi_infocoms.warranty_duration MONTH) > DATE_ADD(now(), INTERVAL -90 DAY)

    Ma question est :

    Je voulais savoir si le dernier AND signifie bien le fait que la date de garantie a expiré il y a au maximum 3 mois.
    Merci

    • Partager sur Facebook
    • Partager sur Twitter
      20 mai 2019 à 16:41:44

      Bonjour,

      Déjà, cette requête ne peut pas fonctionner puisque tu utilises la table glpi_manufacturers dans la clause WHERE sans la préciser dans la clause FROM et sans jointure du coup ...

      TheStagiaire a écrit:

      le dernier AND signifie bien le fait que la date de garantie a expiré il y a au maximum 3 mois

      Si l'on considère que la colonne warranty_duration contient bien un nombre entier exprimant un nombre de mois, alors ta condition est inversée ... il faut changer > en < ...

      ( date de début de garantie + durée de garantie ) < ( aujourd'hui - 3 mois )

      Au passage, pas besoin des DATE_ADD, MySQL sait faire les calculs directement ;)

      Ce qui donne, en utilisant des alias et une indentation pour être plus propre :

      SELECT
          C.serial,
          I.warranty_date + INTERVAL I.warranty_duration MONTH AS FIN_GARANTIE
      FROM
          glpi_computers C
              INNER JOIN glpi_manufacturers M
                  ON C.manufacturers_id = M.id
              INNER JOIN glpi_infocoms I
                  ON I.items_id = C.id
      WHERE
          I.itemtype = "Computer"
          AND C.states_id IN ( 1, 2, 5, 7, 9 )
          AND C.date_mod > NOW() - INTERVAL 1 YEAR
          AND UPPER( M.name ) LIKE "DELL%"
          AND I.warranty_date + INTERVAL I.warranty_duration MONTH < NOW()- INTERVAL 3 MONTH
      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        20 mai 2019 à 16:46:59

        Merci j'ai testé mais ça me renvoie quand même des pc de 2016 alors que ça doit renvoyer un truc de maximum février 2019 au plus tôt:euh:

        -
        Edité par TheStagiaire 20 mai 2019 à 16:50:45

        • Partager sur Facebook
        • Partager sur Twitter
          20 mai 2019 à 17:03:19

          TheStagiaire a écrit:

          la date de garantie a expiré il y a au maximum 3 mois

          J'avais mal lu ... "au maximum 3 mois" ... du coup je reformule "garantie expirée depuis moins de 3 mois"

          Donc il faut 2 conditions ...

          SELECT
              C.serial,
              I.warranty_date + INTERVAL I.warranty_duration MONTH AS FIN_GARANTIE
          FROM
              glpi_computers C
                  INNER JOIN glpi_manufacturers M
                      ON C.manufacturers_id = M.id
                  INNER JOIN glpi_infocoms I
                      ON I.items_id = C.id
          WHERE
              I.itemtype = "Computer"
              AND C.states_id IN ( 1, 2, 5, 7, 9 )
              AND C.date_mod > NOW() - INTERVAL 1 YEAR
              AND UPPER( M.name ) LIKE "DELL%"
              AND I.warranty_date + INTERVAL I.warranty_duration MONTH < NOW() -- garantie expirée
              AND I.warranty_date + INTERVAL I.warranty_duration MONTH > NOW()- INTERVAL 3 MONTH -- depuis moins de 3 mois

          -
          Edité par Benzouye 20 mai 2019 à 17:03:51

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            20 mai 2019 à 18:14:55

            Merci beaucoup j'ai testé et changé la requête : 
            SELECT
                							C.serial,
                							I.warranty_date + INTERVAL I.warranty_duration MONTH AS FIN_GARANTIE
            						FROM
                							glpi_computers C
                    							INNER JOIN glpi_manufacturers M
                        								ON C.manufacturers_id = M.id
                    							INNER JOIN glpi_infocoms I
                        								ON I.items_id = C.id
            						WHERE
                							I.itemtype = "Computer"
               							AND C.states_id IN ( 1, 2, 5, 7, 9 )
                							AND C.date_mod > NOW() - INTERVAL 1 YEAR
                							AND UPPER( M.name ) LIKE "DELL%"
                							AND I.warranty_date + INTERVAL I.warranty_duration MONTH > NOW() 
               							OR I.warranty_date + INTERVAL I.warranty_duration MONTH > NOW()- INTERVAL 3 MONTH
            Le but de ma requête est de récupérer dont la date de garantie n'a pas expirée ou a expiré il y a au maximum 3 mois. Est-ce bon ?

            -
            Edité par TheStagiaire 21 mai 2019 à 8:56:16

            • Partager sur Facebook
            • Partager sur Twitter

            Cette requête SQL est-elle bonne ?

            × 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