Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Select 7 derniers jours

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.