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.