De WHERE
clausule misplaatst is, moet het de tabelverwijzingen en JOIN-bewerkingen volgen.
Zoiets als dit:
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
BEWERKEN (meer dan drie jaar later)
Het bovenstaande beantwoordt in wezen de vraag "Ik heb geprobeerd een WHERE-clausule aan mijn zoekopdracht toe te voegen en nu geeft de zoekopdracht een fout weer, hoe los ik dit op?"
Wat betreft een vraag over het schrijven van een voorwaarde die een datumbereik van "laatste 7 dagen" controleert...
Dat hangt echt af van de interpretatie van de specificatie, wat het datatype van de kolom in de tabel is (DATE of DATETIME) en welke gegevens beschikbaar zijn... wat moet worden geretourneerd.
Samenvattend:de algemene benadering is om een "begin" voor het datum/tijd-bereik en een "einde" van dat bereik te identificeren en ernaar te verwijzen in een query. Laten we eens kijken naar iets makkelijkers... alle rijen voor "gisteren".
Als onze kolom van het type DATE is. Voordat we een uitdrukking in een query opnemen, kunnen we deze testen in een eenvoudige SELECT
SELECT DATE(NOW()) + INTERVAL -1 DAY
en controleer of het geretourneerde resultaat is wat we verwachten. Dan kunnen we diezelfde uitdrukking gebruiken in een WHERE-clausule, en deze vergelijken met een DATE-kolom zoals deze:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
Voor een DATETIME- of TIMESTAMP-kolom kunnen we >=
. gebruiken en <
ongelijkheidsvergelijkingen om een bereik te specificeren
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
Voor "laatste 7 dagen" moeten we weten of dat betekent vanaf dit punt nu, terug 7 dagen ... b.v. de laatste 7*24 uur , inclusief de tijdcomponent in de vergelijking, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
de laatste zeven volledige dagen, vandaag niet meegerekend
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
of de afgelopen zes volledige dagen plus tot nu toe vandaag ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Ik raad aan om de expressies aan de rechterkant in een SELECT-instructie te testen, we kunnen een door de gebruiker gedefinieerde variabele gebruiken in plaats van NOW() om te testen, niet gebonden aan wat NOW() retourneert, zodat we grenzen kunnen testen, over week/maand /jaargrenzen, enzovoort.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
Zodra we expressies hebben die waarden retourneren die werken voor "start" en "end" voor ons specifieke gebruik, wat we bedoelen met "laatste 7 dagen", kunnen we die expressies gebruiken in bereikvergelijkingen in de WHERE-component.
(Sommige ontwikkelaars gebruiken liever de DATE_ADD
en DATE_SUB
functies in plaats van de + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
syntaxis.
En MySQL biedt enkele handige functies voor het werken met de datatypes DATE, DATETIME en TIMESTAMP... DATE, LAST_DAY,
Sommige ontwikkelaars geven er de voorkeur aan om het begin en einde in andere code te berekenen, en leveren letterlijke tekenreeksen in de SQL-query, zodat de query die naar de database wordt verzonden
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
En die aanpak werkt ook. (Mijn voorkeur zou zijn om die letterlijke tekenreeksen expliciet in DATETIME te casten, met CAST, CONVERT of alleen de + INTERVAL-truc...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Het bovenstaande veronderstelt dat we "datums" opslaan in de juiste DATE-, DATETIME- en/of TIMESTAMP-datatypes, en ze niet opslaan als strings in verschillende formaten, b.v. 'dd/mm/yyyy'
, m/d/yyyy
, juliaanse datums, of in sporadisch niet-canonieke formaten, of als een aantal seconden sinds het begin van het tijdperk, zou dit antwoord veel langer moeten zijn.