sql >> Databasteknik >  >> RDS >> Mysql

MySQL Select senaste 7 dagarna

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.



  1. PostgreSQL:Skapa tabell om det inte finns AS

  2. Du kan nu använda Access med Microsoft Azure MFA!

  3. Hur kan jag hämta instans av senast tillagda objekt

  4. mysql pivoting - hur kan jag hämta data från samma tabell till olika kolumner?