WHERE
klausulen är felplacerad, måste den följa tabellreferenserna och JOIN-operationerna.
Något så här:
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
REDIGERA (tre plus år senare)
Ovanstående svarar i huvudsak på frågan "Jag försökte lägga till en WHERE-klausul i min fråga och nu returnerar frågan ett fel, hur fixar jag det?"
Angående en fråga om att skriva ett villkor som kontrollerar ett datumintervall på "senaste 7 dagarna"...
Det beror verkligen på hur specifikationen tolkas, vilken datatyp för kolumnen i tabellen är (DATE eller DATETIME) och vilken data som är tillgänglig... vad som ska returneras.
För att sammanfatta:det allmänna tillvägagångssättet är att identifiera en "start" för datum-/datumtidsintervallet och "slut" för det intervallet, och referera till dem i en fråga. Låt oss överväga något enklare... alla rader för "igår".
Om vår kolumn är av typen DATUM. Innan vi införlivar ett uttryck i en fråga kan vi testa det med ett enkelt SELECT
SELECT DATE(NOW()) + INTERVAL -1 DAY
och kontrollera att resultatet är vad vi förväntar oss. Sedan kan vi använda samma uttryck i en WHERE-sats och jämföra den med en DATE-kolumn så här:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
För kolumnen DATETIME eller TIMESTAMP kan vi använda >=
och <
ojämlikhetsjämförelser för att specificera ett intervall
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
För "senaste 7 dagarna" behöver vi veta om det betyder från denna punkt just nu, tillbaka 7 dagar ... t.ex. de senaste 7*24 timmarna, inklusive tidskomponenten i jämförelsen, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
de senaste sju hela dagarna, exklusive idag
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
eller senaste sex hela dagar plus hittills idag ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Jag rekommenderar att du testar uttrycken på höger sida i en SELECT-sats, vi kan använda en användardefinierad variabel istället för NOW() för att testa, utan att vara bundna till vad NOW() returnerar så vi kan testa gränser, över vecka/månad /årsgränser och så vidare.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
När vi har uttryck som returnerar värden som fungerar för "start" och "slut" för vårt specifika användningsfall, vad vi menar med "senaste 7 dagarna", kan vi använda dessa uttryck i intervalljämförelser i WHERE-satsen.
(Vissa utvecklare föredrar att använda DATE_ADD
och DATE_SUB
fungerar istället för + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
syntax.
Och MySQL tillhandahåller några praktiska funktioner för att arbeta med datatyperna DATE, DATETIME och TIMESTAMP... DATE, LAST_DAY,
Vissa utvecklare föredrar att beräkna början och slutet i annan kod och ange strängliteraler i SQL-frågan, så att frågan som skickas till databasen är
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
Och det tillvägagångssättet fungerar också. (Min preferens skulle vara att uttryckligen gjuta dessa strängliteraler till DATETIME, antingen med CAST, CONVERT eller bara + INTERVAL-tricket...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Ovanstående förutsätter att vi lagrar "datum" i lämpliga datatyper DATE, DATETIME och/eller TIMESTAMP och inte lagrar dem som strängar i olika format, t.ex. 'dd/mm/yyyy'
, m/d/yyyy
, julianska datum, eller i sporadiskt icke-kanoniska format, eller som ett antal sekunder sedan epokens början, skulle det här svaret behöva vara mycket längre.