Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Select ultimi 7 giorni

Il WHERE la clausola è fuori posto, deve seguire i riferimenti alla tabella e le operazioni JOIN.

Qualcosa del genere:

 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

MODIFICA (più di tre anni dopo)

Quanto sopra risponde essenzialmente alla domanda "Ho provato ad aggiungere una clausola WHERE alla mia query e ora la query restituisce un errore, come posso risolverlo?"

Per quanto riguarda una domanda sulla scrittura di una condizione che controlla un intervallo di date di "ultimi 7 giorni"...

Dipende davvero dall'interpretazione delle specifiche, dal tipo di dati della colonna nella tabella (DATE o DATETIME) e dai dati disponibili... cosa dovrebbe essere restituito.

Per riassumere:l'approccio generale consiste nell'identificare un "inizio" per l'intervallo di data/ora e la "fine" di tale intervallo e fare riferimento a quelli in una query. Consideriamo qualcosa di più semplice... tutte le righe per "ieri".

Se la nostra colonna è di tipo DATE. Prima di incorporare un'espressione in una query, possiamo verificarla con un semplice SELECT

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

e verificare che il risultato restituito sia quello che ci aspettiamo. Quindi possiamo usare la stessa espressione in una clausola WHERE, confrontandola con una colonna DATE come questa:

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

Per una colonna DATETIME o TIMESTAMP, possiamo utilizzare >= e < confronti di disuguaglianza per specificare un intervallo

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

Per "ultimi 7 giorni" dobbiamo sapere se ciò significa da questo momento in poi, indietro di 7 giorni ... ad es. le ultime 7*24 ore , inclusa la componente temporale nel confronto, ...

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

gli ultimi sette giorni completi, escluso oggi

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

o negli ultimi sei giorni completi più finora oggi ...

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

Raccomando di testare le espressioni sul lato destro in un'istruzione SELECT, possiamo usare una variabile definita dall'utente al posto di NOW() per il test, non essendo legati a ciò che NOW() restituisce in modo da poter testare i bordi, attraverso la settimana/mese limiti di /anno e così via.

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

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

Una volta che abbiamo espressioni che restituiscono valori che funzionano per "inizio" e "fine" per il nostro caso d'uso particolare, cosa intendiamo per "ultimi 7 giorni", possiamo usare quelle espressioni nei confronti di intervalli nella clausola WHERE.

(Alcuni sviluppatori preferiscono utilizzare il DATE_ADD e DATE_SUB funzioni al posto del + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR sintassi.

E MySQL fornisce alcune utili funzioni per lavorare con i tipi di dati DATE, DATETIME e TIMESTAMP... DATE, LAST_DAY,

Alcuni sviluppatori preferiscono calcolare l'inizio e la fine in altro codice e fornire valori letterali stringa nella query SQL, in modo tale che la query inviata al database sia

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

E anche questo approccio funziona. (La mia preferenza sarebbe quella di lanciare in modo esplicito quelle stringhe letterali in DATETIME, sia con CAST, CONVERT o solo con il trucco + INTERVAL...

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

Quanto sopra presuppone che stiamo memorizzando le "date" nei tipi di dati DATE, DATETIME e/o TIMESTAMP appropriati e non le archiviamo come stringhe in una varietà di formati, ad es. 'dd/mm/yyyy' , m/d/yyyy , date giuliano, o in formati sporadicamente non canonici, o come numero di secondi dall'inizio dell'epoca, questa risposta dovrebbe essere molto più lunga.