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.