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

MySQL Select sidste 7 dage

WHERE klausulen er forlagt, skal den følge tabelreferencerne og JOIN-operationerne.

Noget som dette:

 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

REDIGER (tre år senere)

Ovenstående besvarer i det væsentlige spørgsmålet "Jeg forsøgte at tilføje en WHERE-klausul til min forespørgsel, og nu returnerer forespørgslen en fejl, hvordan løser jeg det?"

Med hensyn til et spørgsmål om at skrive en betingelse, der kontrollerer et datointerval på "sidste 7 dage"...

Det afhænger virkelig af fortolkningen af ​​specifikationen, hvad datatypen for kolonnen i tabellen er (DATE eller DATETIME) og hvilke data der er tilgængelige... hvad skal returneres.

For at opsummere:den generelle tilgang er at identificere en "start" for dato-/datotidsintervallet og "slut" for dette interval og referere til dem i en forespørgsel. Lad os overveje noget lettere... alle rækker for "i går".

Hvis vores kolonne er DATE type. Før vi inkorporerer et udtryk i en forespørgsel, kan vi teste det i et simpelt SELECT

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

og kontroller, at det returnerede resultat er, hvad vi forventer. Så kan vi bruge det samme udtryk i en WHERE-sætning og sammenligne den med en DATE-kolonne som denne:

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

For en DATETIME eller TIMESTAMP kolonne kan vi bruge >= og < ulighedssammenligninger for at angive et interval

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

For "sidste 7 dage" skal vi vide, om det betyder fra dette tidspunkt lige nu, tilbage 7 dage ... f.eks. de sidste 7*24 timer, inklusive tidskomponenten i sammenligningen, ...

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

de sidste syv hele dage, ikke medregnet i dag

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

eller sidste seks hele dage plus indtil videre i dag ...

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

Jeg anbefaler at teste udtrykkene på højre side i en SELECT-sætning, vi kan bruge en brugerdefineret variabel i stedet for NOW() til test, uden at være bundet til det NOW() returnerer, så vi kan teste grænser på tværs af uge/måned /årsgrænser og så videre.

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

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

Når vi har udtryk, der returnerer værdier, der fungerer for "start" og "slut" for vores særlige brugstilfælde, hvad vi mener med "sidste 7 dage", kan vi bruge disse udtryk i intervalsammenligninger i WHERE-sætningen.

(Nogle udviklere foretrækker at bruge DATE_ADD og DATE_SUB fungerer i stedet for + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR syntaks.

Og MySQL giver nogle praktiske funktioner til at arbejde med datatyperne DATE, DATETIME og TIMESTAMP... DATE, LAST_DAY,

Nogle udviklere foretrækker at beregne starten og slutningen i anden kode og levere strenge bogstaver i SQL-forespørgslen, således at forespørgslen, der sendes til databasen, er

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

Og den tilgang virker også. (Min præference ville være eksplicit at caste disse strenge bogstaver ind i DATETIME, enten med CAST, CONVERT eller bare + INTERVAL-tricket...

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

Ovenstående forudsætter alt, at vi gemmer "datoer" i passende DATE, DATETIME og/eller TIMESTAMP datatyper og ikke gemmer dem som strenge i forskellige formater, f.eks. 'dd/mm/yyyy' , m/d/yyyy , julianske datoer eller i sporadisk ikke-kanoniske formater, eller som et antal sekunder siden begyndelsen af ​​epoken, ville dette svar skulle være meget længere.



  1. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Kommunikationsforbindelsesfejl

  2. Indsaml ydeevnedata ved hjælp af SQLDiag Tool | SQL Server Performance Fejlfinding -6

  3. Returner en liste over e-mails sendt fra SQL Server Database Mail (T-SQL)

  4. PostgreSQL DATEADD() Tilsvarende