w3schools tipos into inner example consultas mysql sql where-clause date-arithmetic

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;