2014-06-17 22 views
10

Ho letto alcuni messaggi qui e sembra niente di speciale ma non riesco ancora a selezionare le voci degli ultimi giorni.MySQL Selezionare gli ultimi 7 giorni

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); 

Se aggiungo il tempo tra oggi e gli ultimi 7 giorni, il mio codice non restituirà nulla.

+0

Questo è il post che ho letto e utilizzato nel mio codice. – karadayi

+0

Tu don ' t spiegare quale errore si ottiene o come questo non funziona. A meno che questa domanda non sia migliorata, verrà chiusa una domanda doppia. –

+0

Non ottengo alcun output (nessun errore, nessun risultato) Se aggiungo la riga con 'DATE (dErstellt)> (NOW() - INTERVAL 7 DAY)' – karadayi

risposta

37

La clausola WHERE è fuori luogo, si deve seguire i riferimenti di tabella e operazioni di JOIN.

Qualcosa di simile a questo:

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 

EDIT (tre anni più tardi)

È possibile che risponde essenzialmente alla domanda "ho cercato di aggiungere una clausola WHERE per la mia strategia e ora la query restituisce un errore, come posso risolverlo? "

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

Che in realtà dipende l'interpretazione delle specifiche, quali il tipo di dati della colonna della tabella è (DATA o DATETIME) e quali dati sono disponibili ... cosa deve essere restituito.

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

Se la nostra colonna è di tipo DATE. Prima incorporiamo un'espressione in una query, siamo in grado di provarlo in una semplice SELEZIONA

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

e verificare il risultato restituito è quello che ci aspettiamo. Poi possiamo usare la stessa espressione in una clausola WHERE, paragonandola a una colonna data così:

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

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

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

Per "ultimi 7 giorni" abbiamo bisogno di sapere se ciò significa da questo punto in questo momento, indietro 7 giorni ... ad esempio ultimi 7 * 24 ore, tra la componente temporale nel confronto, ...

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

ultimi sette giorni completi, esclusi oggi

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

o passato sei giorni completi più finora oggi ...

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

consiglio 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 legato a quello NOW() restituisce in modo che possiamo testare i confini, oltre i confini di settimana/mese/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 lavorano per "Start" e "End" per il nostro particolare caso d'uso, ciò che intendiamo per "ultimi 7 giorni", possiamo usare quelle espressioni nei confronti gamma del Dove la clausola.

(Alcuni sviluppatori preferiscono usare i DATE_ADD e DATE_SUB funzioni al posto della sintassi + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR.

e MySQL fornisce alcune comode funzioni per lavorare con la data, DATETIME TIMESTAMP e tipi di dati ... DATA, LAST_DAY,

Alcuni sviluppatori preferiscono calcolare l'inizio e la fine di altri codici, e letterali stringa di approvvigionamento nella query SQL, in modo che la query inviata al database è

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, convertire o solo il trucco + INTERVALLO ...

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

Il soprattutto assume abbiamo memorizzato "date" in appositi Data, DATETIME e/o tipi di dati TIMESTAMP e non li memorizzano come stringhe in vari formati, ad esempio 'dd/mm/yyyy', m/d/yyyy, date giuliane, o in formati sporadicamente non canonici, o come un numero di secondi dall'inizio dell'epoca, questa risposta dovrebbe essere molto più lungo

+0

Non ho mai saputo del comando INTERVAL. Strumento davvero interessante da aggiungere alla casella degli strumenti. Grazie ! – CTala

+0

@JunedAnsari: una richiesta per l'intervallo di date di "ultimi 7 giorni" potrebbe anche essere soddisfatta da 'dtcol> = DATE (NOW()) + INTERVAL -7 DAY AND dtcol spencer7593

+0

@JunedAnsari: risposta ampliata per includere la discussione sulle possibili interpretazioni degli "ultimi 7 giorni" e una discussione generale sull'approccio da prendere in condizioni di scrittura per una varietà di intervalli data/datetime – spencer7593

4

Dal momento che si sta utilizzando un INNER JOIN si può semplicemente mettere le condizioni nella clausola WHERE, come questo:

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; 
Problemi correlati