sql >> Database >  >> RDS >> Mysql

MySQL Select afgelopen 7 dagen

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.



  1. Rails Migrations:geprobeerd om het type kolom te veranderen van string naar integer

  2. Android naar Wamp Server-verbinding met Android Studio en PHP

  3. 4 manieren om het gegevenstype van een kolom in MySQL te controleren

  4. MijnISAM versus InnoDB