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
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
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
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
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.
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 ?