WHERE
клаузата е неуместна, тя трябва да следва препратките към таблицата и операциите JOIN.
Нещо като това:
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
РЕДАКТИРАНЕ (три и повече години по-късно)
Горното по същество отговаря на въпроса "Опитах се да добавя клауза WHERE към моята заявка и сега заявката връща грешка, как да я поправя?"
Що се отнася до написването на условие, което проверява период от време "последните 7 дни"...
Това наистина зависи от тълкуването на спецификацията, какъв е типът данни на колоната в таблицата (ДАТА или ДАТА ВРЕМЕ) и какви данни са налични... какво трябва да бъде върнато.
За да обобщим:общият подход е да се идентифицира „начало“ за диапазона от дата/време и „край“ на този диапазон и да се препратят към тях в заявка. Нека разгледаме нещо по-лесно... всички редове за "вчера".
Ако нашата колона е тип ДАТА. Преди да включим израз в заявка, можем да го тестваме с обикновен SELECT
SELECT DATE(NOW()) + INTERVAL -1 DAY
и се уверете, че върнатият резултат е това, което очакваме. След това можем да използваме същия израз в клауза WHERE, като го сравняваме с колона DATE по следния начин:
WHERE datecol = DATE(NOW()) + INTERVAL -1 DAY
За колона DATETIME или TIMESTAMP можем да използваме >=
и <
сравнения на неравенства за определяне на диапазон
WHERE datetimecol >= DATE(NOW()) + INTERVAL -1 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
За "последните 7 дни" трябва да знаем дали това означава от този момент точно сега, 7 дни назад ... напр. последните 7*24 часа, включително времевия компонент в сравнението, ...
WHERE datetimecol >= NOW() + INTERVAL -7 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
последните седем пълни дни, без днешния ден
WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
AND datetimecol < DATE(NOW()) + INTERVAL 0 DAY
или последните шест пълни дни плюс днес днес ...
WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
AND datetimecol < NOW() + INTERVAL 0 DAY
Препоръчвам да тествате изразите от дясната страна в оператор SELECT, можем да използваме дефинирана от потребител променлива на мястото на NOW() за тестване, без да сме обвързани с това, което NOW() връща, за да можем да тестваме граници през седмица/месец /години граници и т.н.
SET @clock = '2017-11-17 11:47:47' ;
SELECT DATE(@clock)
, DATE(@clock) + INTERVAL -7 DAY
, @clock + INTERVAL -6 DAY
След като имаме изрази, които връщат стойности, които работят за "начало" и "край" за нашия конкретен случай на използване, което имаме предвид под "последните 7 дни", можем да използваме тези изрази в сравнения на диапазони в клаузата WHERE.
(Някои разработчици предпочитат да използват DATE_ADD
и DATE_SUB
функции на мястото на + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR
синтаксис.
MySQL предоставя някои удобни функции за работа с типове данни DATE, DATETIME и TIMESTAMP... DATE, LAST_DAY,
Някои разработчици предпочитат да изчисляват началото и края в друг код и да предоставят низови литерали в SQL заявката, така че заявката, изпратена до базата данни, е
WHERE datetimecol >= '2017-11-10 00:00'
AND datetimecol < '2017-11-17 00:00'
И този подход също работи. (Моето предпочитание би било изрично да прехвърля тези низови литерали в DATETIME, или с CAST, CONVERT или просто с трика + INTERVAL...
WHERE datetimecol >= '2017-11-10 00:00' + INTERVAL 0 SECOND
AND datetimecol < '2017-11-17 00:00' + INTERVAL 0 SECOND
Всичко по-горе предполага, че съхраняваме „датите“ в подходящи типове данни DATE, DATETIME и/или TIMESTAMP, а не ги съхраняваме като низове в различни формати, напр. 'dd/mm/yyyy'
, m/d/yyyy
, юлиански дати, или в спорадично неканонични формати, или като брой секунди от началото на епохата, този отговор ще трябва да бъде много по-дълъг.