sql >> Databáze >  >> RDS >> Mysql

MySQL Select za posledních 7 dní

WHERE klauzule je špatně umístěna, musí se řídit odkazy na tabulky a operacemi JOIN.

Něco jako toto:

 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

UPRAVIT (o tři roky později)

Výše uvedené v podstatě odpovídá na otázku „Snažil jsem se do svého dotazu přidat klauzuli WHERE a dotaz nyní vrací chybu, jak to mohu opravit?“

Pokud jde o otázku napsání podmínky, která kontroluje rozsah dat „posledních 7 dní“...

To opravdu závisí na interpretaci specifikace, na tom, jaký je datový typ sloupce v tabulce (DATE nebo DATETIME) a ​​jaká data jsou k dispozici... co by se mělo vrátit.

Abychom to shrnuli:obecným přístupem je identifikovat „začátek“ pro rozsah data/datum a čas a „konec“ tohoto rozsahu a odkazovat na ně v dotazu. Zvažme něco jednoduššího... všechny řádky pro "včera".

Pokud je náš sloupec typu DATE. Než výraz začleníme do dotazu, můžeme jej otestovat v jednoduchém SELECT

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

a ověřte, že vrácený výsledek je to, co očekáváme. Potom můžeme použít stejný výraz v klauzuli WHERE a porovnat jej se sloupcem DATE takto:

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

Pro sloupec DATETIME nebo TIMESTAMP můžeme použít >= a < porovnání nerovností k určení rozsahu

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

Pro „posledních 7 dní“ potřebujeme vědět, zda to znamená od tohoto okamžiku právě teď, zpět 7 dní ... např. posledních 7*24 hodin, včetně časové složky ve srovnání, ...

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

posledních sedm celých dní, kromě dneška

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

nebo posledních šest celých dní plus zatím dnes ...

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

Doporučuji otestovat výrazy na pravé straně v příkazu SELECT, pro testování můžeme použít uživatelsky definovanou proměnnou místo NOW(), aniž bychom byli vázáni na to, co vrací NOW(), abychom mohli testovat hranice v průběhu týdne/měsíce /rok hranice a tak dále.

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

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

Jakmile budeme mít výrazy, které vracejí hodnoty, které fungují pro „start“ a „end“ pro náš konkrétní případ použití, což máme na mysli „posledních 7 dní“, můžeme tyto výrazy použít při porovnávání rozsahů v klauzuli WHERE.

(Někteří vývojáři dávají přednost použití DATE_ADD a DATE_SUB funkce namísto + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR syntaxe.

A MySQL poskytuje některé pohodlné funkce pro práci s datovými typy DATE, DATETIME a TIMESTAMP... DATE, LAST_DAY,

Někteří vývojáři dávají přednost výpočtu začátku a konce v jiném kódu a dodávání řetězcových literálů v dotazu SQL, takže dotaz odeslaný do databáze je

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

A tento přístup také funguje. (Moje přednost by bylo explicitně přetypovat tyto řetězcové literály do DATETIME, buď pomocí CAST, CONVERT nebo pouze trikem + INTERVAL...

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

Vše výše uvedené předpokládá, že ukládáme „data“ do příslušných datových typů DATE, DATETIME a/nebo TIMESTAMP a neukládáme je jako řetězce v různých formátech, např. 'dd/mm/yyyy' , m/d/yyyy , juliánská data nebo ve sporadicky nekanonických formátech nebo jako počet sekund od začátku epochy, tato odpověď by musela být mnohem delší.



  1. Ukládání obchodní logiky do databáze

  2. MariaDB JSON_VALID() Vysvětleno

  3. Vícenásobné rozevírací pole PHP Odeslat formulář do MySQL

  4. Databáze SQL Server Importers z celého světa kompatibilní s přístupem