sql >> Base de Datos >  >> RDS >> Mysql

MySQL Seleccione los últimos 7 días

El WHERE la cláusula está fuera de lugar, tiene que seguir las referencias de la tabla y las operaciones JOIN.

Algo como esto:

 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

EDITAR (más de tres años después)

Lo anterior esencialmente responde a la pregunta "Intenté agregar una cláusula WHERE a mi consulta y ahora la consulta devuelve un error, ¿cómo lo soluciono?"

En cuanto a una pregunta sobre cómo escribir una condición que verifique un rango de fechas de "últimos 7 días"...

Eso realmente depende de interpretar la especificación, cuál es el tipo de datos de la columna en la tabla (DATE o DATETIME) y qué datos están disponibles... qué debe devolverse.

Para resumir:el enfoque general es identificar un "inicio" para el rango de fecha/fechahora y un "final" de ese rango, y hacer referencia a ellos en una consulta. Consideremos algo más fácil... todas las filas para "ayer".

Si nuestra columna es de tipo FECHA. Antes de incorporar una expresión en una consulta, podemos probarla con un simple SELECCIONAR

 SELECT DATE(NOW()) + INTERVAL -1 DAY 

y verifique que el resultado devuelto sea lo que esperamos. Entonces podemos usar esa misma expresión en una cláusula WHERE, comparándola con una columna DATE como esta:

 WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY

Para una columna DATETIME o TIMESTAMP, podemos usar >= y < comparaciones de desigualdad para especificar un rango

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

Para "últimos 7 días" necesitamos saber si eso significa desde este punto ahora mismo, 7 días atrás... p. las últimas 7*24 horas, incluido el componente de tiempo en la comparación,...

 WHERE datetimecol >= NOW() + INTERVAL -7 DAY
   AND datetimecol <  NOW() + INTERVAL  0 DAY

los últimos siete días completos, sin incluir hoy

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

o pasados ​​seis días completos más hasta ahora...

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
   AND datetimecol <  NOW()       + INTERVAL  0 DAY

Recomiendo probar las expresiones en el lado derecho en una declaración SELECT, podemos usar una variable definida por el usuario en lugar de NOW() para probar, sin estar atados a lo que devuelve NOW() para que podamos probar los bordes, a lo largo de la semana/mes límites de /año, y así sucesivamente.

SET @clock = '2017-11-17 11:47:47' ;

SELECT DATE(@clock)
     , DATE(@clock) + INTERVAL -7 DAY 
     , @clock + INTERVAL -6 DAY 

Una vez que tengamos expresiones que devuelvan valores que funcionen para "inicio" y "fin" para nuestro caso de uso particular, lo que queremos decir con "últimos 7 días", podemos usar esas expresiones en comparaciones de rango en la cláusula WHERE.

(Algunos desarrolladores prefieren usar el DATE_ADD y DATE_SUB funciones en lugar de + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR sintaxis.

Y MySQL proporciona algunas funciones convenientes para trabajar con los tipos de datos DATE, DATETIME y TIMESTAMP... DATE, LAST_DAY,

Algunos desarrolladores prefieren calcular el inicio y el final en otro código y proporcionar cadenas literales en la consulta SQL, de modo que la consulta enviada a la base de datos sea

  WHERE datetimecol >= '2017-11-10 00:00'
    AND datetimecol <  '2017-11-17 00:00'

Y ese enfoque también funciona. (Mi preferencia sería convertir explícitamente esos literales de cadena en DATETIME, ya sea con CAST, CONVERT o simplemente el truco + INTERVAL...

  WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
    AND datetimecol <  '2017-11-17 00:00' + INTERVAL 0 SECOND

Todo lo anterior supone que estamos almacenando "fechas" en los tipos de datos DATE, DATETIME y/o TIMESTAMP apropiados, y no almacenándolos como cadenas en una variedad de formatos, p. 'dd/mm/yyyy' , m/d/yyyy , fechas julianas, o en formatos esporádicamente no canónicos, o como un número de segundos desde el comienzo de la época, esta respuesta debería ser mucho más larga.