Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL Select últimos 7 dias


O WHERE cláusula está mal colocada, ela deve seguir as referências da tabela e as operações JOIN.

Algo assim:
 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 (mais três anos depois)

O acima responde essencialmente à pergunta "Tentei adicionar uma cláusula WHERE à minha consulta e agora a consulta está retornando um erro, como faço para corrigi-lo?"

Quanto a uma pergunta sobre como escrever uma condição que verifica um intervalo de datas de "últimos 7 dias"...

Isso realmente depende da interpretação da especificação, qual é o tipo de dados da coluna na tabela (DATE ou DATETIME) e quais dados estão disponíveis... o que deve ser retornado.

Para resumir:a abordagem geral é identificar um "início" para o intervalo de data/hora e um "fim" desse intervalo e referenciá-los em uma consulta. Vamos considerar algo mais fácil... todas as linhas para "ontem".

Se nossa coluna for do tipo DATE. Antes de incorporarmos uma expressão em uma consulta, podemos testá-la em um simples SELECT
 SELECT DATE(NOW()) + INTERVAL -1 DAY 

e verifique se o resultado retornado é o que esperamos. Então podemos usar essa mesma expressão em uma cláusula WHERE, comparando-a com uma coluna DATE como esta:
 WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY

Para uma coluna DATETIME ou TIMESTAMP, podemos usar >= e < comparações de desigualdade para especificar um intervalo
 WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

Para "últimos 7 dias", precisamos saber se isso significa a partir deste ponto agora, de volta 7 dias ... por exemplo as últimas 7*24 horas , incluindo o componente de tempo na comparação, ...
 WHERE datetimecol >= NOW() + INTERVAL -7 DAY
   AND datetimecol <  NOW() + INTERVAL  0 DAY

os últimos sete dias completos, não incluindo hoje
 WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY

ou passados ​​seis dias completos mais até agora...
 WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
   AND datetimecol <  NOW()       + INTERVAL  0 DAY

Eu recomendo testar as expressões do lado direito em uma instrução SELECT, podemos usar uma variável definida pelo usuário no lugar de NOW() para teste, não ficando vinculado ao que NOW() retorna para que possamos testar bordas, ao longo da semana/mês limites /ano, e assim por diante.
SET @clock = '2017-11-17 11:47:47' ;

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

Assim que tivermos expressões que retornam valores que funcionam para "início" e "fim" para nosso caso de uso específico, o que queremos dizer com "últimos 7 dias", podemos usar essas expressões em comparações de intervalo na cláusula WHERE.

(Alguns desenvolvedores preferem usar o DATE_ADD e DATE_SUB funções no lugar de + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR sintaxe.

E o MySQL fornece algumas funções convenientes para trabalhar com tipos de dados DATE, DATETIME e TIMESTAMP... DATE, LAST_DAY,

Alguns desenvolvedores preferem calcular o início e o fim em outro código e fornecer literais de string na consulta SQL, de modo que a consulta enviada ao banco de dados seja
  WHERE datetimecol >= '2017-11-10 00:00'
    AND datetimecol <  '2017-11-17 00:00'

E essa abordagem também funciona. (Minha preferência seria converter explicitamente esses literais de string em DATETIME, com CAST, CONVERT ou apenas o truque + INTERVAL ...
  WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
    AND datetimecol <  '2017-11-17 00:00' + INTERVAL 0 SECOND

Acima de tudo, assume que estamos armazenando "datas" em tipos de dados apropriados DATE, DATETIME e/ou TIMESTAMP, e não armazenando-os como strings em vários formatos, por exemplo, 'dd/mm/yyyy' , m/d/yyyy , datas julianas, ou em formatos esporadicamente não canônicos, ou como um número de segundos desde o início da época, essa resposta precisaria ser muito mais longa.