tipos - MySQL Select últimos 7 días
select mysql w3schools (2)
He leído algunos mensajes aquí y no parece nada especial, pero aún no puedo seleccionar las entradas de los últimos días.
SELECT
p1.kArtikel,
p1.cName,
p1.cKurzBeschreibung,
p1.dLetzteAktualisierung,
p1.dErstellt,
p1.cSeo,
p2.kartikelpict,
p2.nNr,
p2.cPfad
FROM
tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
INNER JOIN
tartikelpict AS p2
ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)
ORDER BY
p1.kArtikel DESC
LIMIT
100;'', $connection);
Si agrego entre hoy y los últimos 7 días, mi Código no generará nada.
La cláusula WHERE
está fuera de lugar, debe seguir las referencias de la tabla y las operaciones de UNIR.
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 responde esencialmente a la pregunta "Intenté agregar una cláusula WHERE a mi consulta y ahora la consulta está devolviendo un error, ¿cómo lo arreglo?"
En cuanto a una pregunta sobre cómo escribir una condición que verifique un rango de fechas de "los últimos 7 días" ...
Eso realmente depende de la interpretación de la especificación, cuál es el tipo de datos de la columna en la tabla (FECHA o FECHA) y qué datos están disponibles ... qué se debe devolver.
Para resumir: el enfoque general es identificar un "inicio" para el rango de fecha / fecha y hora, y el "final" de ese rango, y hacer referencia a aquellos en una consulta. Consideremos algo más fácil ... todas las filas para "ayer".
Si nuestra columna es del tipo FECHA. Antes de incorporar una expresión en una consulta, podemos probarlo en un simple SELECCIONAR
SELECT DATE(NOW()) + INTERVAL -1 DAY
y verificar que el resultado devuelto sea lo que esperamos. Luego 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 "los últimos 7 días" necesitamos saber si eso significa desde este punto en este momento, hace 7 días ... por ejemplo, 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 hoy ...
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 las pruebas, sin estar atadas a lo que NOW () devuelve, por lo que podemos probar los bordes, durante la semana / mes / año límites, 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 tenemos expresiones que devuelven valores que funcionan para "inicio" y "final" para nuestro caso de uso particular, lo que entendemos por "últimos 7 días", podemos usar esas expresiones en las comparaciones de rango en la cláusula WHERE.
(Algunos desarrolladores prefieren usar las funciones DATE_ADD
y DATE_SUB
en lugar de la sintaxis + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
.
Y MySQL proporciona algunas funciones prácticas 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 literales de cadena en la consulta SQL, de manera 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 con el truco + INTERVAL ...
WHERE datetimecol >= ''2017-11-10 00:00'' + INTERVAL 0 SECOND
AND datetimecol < ''2017-11-17 00:00'' + INTERVAL 0 SECOND
Lo anterior supone que almacenamos "fechas" en los tipos de datos DATE, DATETIME y / o TIMESTAMP apropiados, y no los almacenamos como cadenas en una variedad de formatos, por ejemplo ''dd/mm/yyyy''
, m/d/yyyy
, fechas julianas, o Esporádicamente en formatos 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.
Ya que está utilizando un INNER JOIN, puede poner las condiciones en la cláusula WHERE, como esto:
SELECT
p1.kArtikel,
p1.cName,
p1.cKurzBeschreibung,
p1.dLetzteAktualisierung,
p1.dErstellt,
p1.cSeo,
p2.kartikelpict,
p2.nNr,
p2.cPfad
FROM
tartikel AS p1 INNER JOIN tartikelpict AS p2
ON p1.kArtikel = p2.kArtikel
WHERE
DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
AND p2.nNr = 1
ORDER BY
p1.kArtikel DESC
LIMIT
100;