Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Изберете последните 7 дни

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 , юлиански дати, или в спорадично неканонични формати, или като брой секунди от началото на епохата, този отговор ще трябва да бъде много по-дълъг.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF-8 докрай

  2. Генерирайте целочислена последователност в MySQL

  3. Как да свържете Amazon RDS в iOS

  4. Как да синхронизирам повторно Mysql DB, ако главен и подчинен имат различен корпус на база данни на Mysql репликация?

  5. Как да използвате wireshark за ясно улавяне на mysql заявка sql