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.