Le WHERE
la clause est mal placée, elle doit suivre les références de table et les opérations JOIN.
Quelque chose comme ça :
FROM tartikel p1
JOIN tartikelpict p2
ON p1.kArtikel = p2.kArtikel
AND p2.nNr = 1
WHERE p1.dErstellt >= DATE(NOW()) - INTERVAL 7 DAY
ORDER BY p1.kArtikel DESC
MODIFIER (plus de trois ans plus tard)
Ce qui précède répond essentiellement à la question "J'ai essayé d'ajouter une clause WHERE à ma requête et maintenant la requête renvoie une erreur, comment puis-je la corriger ?"
Quant à une question sur l'écriture d'une condition qui vérifie une plage de dates de "7 derniers jours"...
Cela dépend vraiment de l'interprétation de la spécification, du type de données de la colonne dans la table (DATE ou DATETIME) et des données disponibles... de ce qui doit être renvoyé.
Pour résumer :l'approche générale consiste à identifier un « début » pour la plage de date/heure et une « fin » de cette plage, et de les référencer dans une requête. Considérons quelque chose de plus facile... toutes les lignes pour "hier".
Si notre colonne est de type DATE. Avant d'incorporer une expression dans une requête, nous pouvons la tester dans un simple SELECT
SELECT DATE(NOW()) + INTERVAL -1 DAY
et vérifiez que le résultat renvoyé correspond à ce que nous attendons. Ensuite, nous pouvons utiliser cette même expression dans une clause WHERE, en la comparant à une colonne DATE comme celle-ci :
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
Pour une colonne DATETIME ou TIMESTAMP, nous pouvons utiliser >=
et <
comparaisons d'inégalité pour spécifier une plage
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
Pour les "7 derniers jours", nous devons savoir si cela signifie à partir de maintenant, 7 jours en arrière... par ex. les 7*24 dernières heures, y compris la composante temporelle dans la comparaison, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
les sept derniers jours complets, sans compter aujourd'hui
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
ou six derniers jours complets plus jusqu'à présent aujourd'hui ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Je recommande de tester les expressions sur le côté droit dans une instruction SELECT, nous pouvons utiliser une variable définie par l'utilisateur à la place de NOW() pour les tests, sans être lié à ce que NOW() renvoie afin que nous puissions tester les frontières, à travers la semaine/mois /limites de l'année, et ainsi de suite.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
Une fois que nous avons des expressions qui renvoient des valeurs qui fonctionnent pour "début" et "fin" pour notre cas d'utilisation particulier, ce que nous entendons par "7 derniers jours", nous pouvons utiliser ces expressions dans des comparaisons de plage dans la clause WHERE.
(Certains développeurs préfèrent utiliser le DATE_ADD
et DATE_SUB
fonctionne à la place du + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
syntaxe.
Et MySQL fournit des fonctions pratiques pour travailler avec les types de données DATE, DATETIME et TIMESTAMP... DATE, LAST_DAY,
Certains développeurs préfèrent calculer le début et la fin dans un autre code et fournir des littéraux de chaîne dans la requête SQL, de sorte que la requête soumise à la base de données soit
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
Et cette approche fonctionne aussi. (Ma préférence serait de convertir explicitement ces littéraux de chaîne en DATETIME, soit avec CAST, CONVERT ou simplement l'astuce + INTERVAL...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Ce qui précède suppose que nous stockons les "dates" dans les types de données DATE, DATETIME et/ou TIMESTAMP appropriés, et que nous ne les stockons pas sous forme de chaînes dans une variété de formats, par ex. 'dd/mm/yyyy'
, m/d/yyyy
, dates juliennes, ou dans des formats sporadiquement non canoniques, ou en nombre de secondes depuis le début de l'époque, cette réponse devrait être beaucoup plus longue.