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ší.