MySQL Wybierz ostatnie 7 dni

Czytałem kilka postów tutaj i wydaje się, że nic specjalnego, ale nie mogę jeszcze wybrać wpisy z ostatnich dni.

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad

FROM 
    tartikel AS p1 WHERE DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)

INNER JOIN 
    tartikelpict AS p2 
    ON (p1.kArtikel = p2.kArtikel) WHERE (p2.nNr = 1)

ORDER BY 
    p1.kArtikel DESC

LIMIT
    100;', $connection);

Jeśli dodam od dzisiaj do ostatnich 7 dni, Mój kod nie wyświetli niczego.

Author: karadayi, 2014-06-17

2 answers

Klauzula WHERE jest zapożyczona, musi podążać za odniesieniami do tabeli i łączyć operacje.

Coś takiego:

 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

EDIT (Trzy plus lata później)

Powyższe zasadniczo odpowiada na pytanie " próbowałem dodać klauzulę WHERE do mojego zapytania i teraz zapytanie zwraca błąd, jak to naprawić?"

Co do pytania o napisanie warunku, który sprawdza zakres dat "ostatnie 7 dni"...

To naprawdę zależy od interpretacja specyfikacji, jaki jest typ danych kolumny w tabeli (DATE lub DATETIME) i jakie dane są dostępne... co należy zwrócić.

Podsumowując: ogólne podejście polega na określeniu "początku" dla zakresu date / datetime i "końca" tego zakresu i odwołaniu się do nich w zapytaniu. Rozważmy coś prostszego... wszystkie wiersze dla "wczoraj".

Jeśli nasza kolumna jest typu DATE. Zanim włączymy wyrażenie do zapytania, możemy przetestować je w prosty Wybierz

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

I zweryfikować zwrócony wynik jest tym, czego oczekujemy. Następnie możemy użyć tego samego wyrażenia w klauzuli WHERE, porównując je do kolumny DATE takiej jak ta:

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

Dla kolumny DATETIME lub TIMESTAMP, możemy użyć porównań nierówności >= i <, aby określić zakres

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

Dla "ostatnich 7 dni" musimy wiedzieć, czy to oznacza od tego momentu teraz, z powrotem 7 dni ... np. ostatnie 7 * 24 godziny, łącznie ze składnikiem czasowym w porównaniu, ...

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

Ostatnie siedem dni, nie wliczając dzisiaj

 WHERE datetimecol >= DATE(NOW()) + INTERVAL -7 DAY
   AND datetimecol <  DATE(NOW()) + INTERVAL  0 DAY
Albo ostatnie sześć dni plus do tej pory dzisiaj ...
 WHERE datetimecol >= DATE(NOW()) + INTERVAL -6 DAY
   AND datetimecol <  NOW()       + INTERVAL  0 DAY

Zalecam przetestowanie wyrażeń po prawej stronie w instrukcji SELECT, możemy użyć zmiennej zdefiniowanej przez użytkownika zamiast NOW() do testowania, nie będąc powiązanym z tym, co zwraca NOW (), abyśmy mogli testować granice, między granicami tygodnia/miesiąca / roku i tak dalej.

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

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

Gdy mamy wyrażenia, które zwracają wartości, które działają dla " start" i "koniec" dla naszego konkretnego przypadku użycia, co rozumiemy przez "ostatnie 7 dni", możemy użyć tych wyrażeń w porównaniach zakresu w klauzuli WHERE.

(niektórzy programiści wolą używać funkcji DATE_ADD i DATE_SUB zamiast składni + INTERVAL val DAY/HOUR/MINUTE/MONTH/YEAR.

I MySQL zapewnia kilka wygodnych funkcji do pracy z datami, datami i znacznikami czasu... DATA, LAST_DAY,

Niektórzy programiści wolą obliczyć początek i koniec w innym kodzie i podać literały ciągu w Zapytanie SQL, takie, że zapytanie przesłane do bazy danych jest

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

I to podejście też działa. (Moim preferowaniem byłoby jawne rzucanie tych literałów ciągów w DATETIME, albo z CAST, CONVERT lub po prostu trick interwałowy+...

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

Powyższe zakłada, że przechowujemy "daty" w odpowiednich typach dat, DATETIME i/lub DATESTAMP, a nie przechowujemy ich jako ciągi znaków w różnych formatach, np. 'dd/mm/yyyy', m/d/yyyy, daty juliańskie, lub sporadycznie formaty niekanoniczne, czyli kilka sekund od początku epoki, odpowiedź ta musiałaby być znacznie dłuższa.

 117
Author: spencer7593,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-18 00:48:23

Ponieważ używasz łącznika wewnętrznego, możesz po prostu umieścić warunki w klauzuli WHERE, tak:

SELECT 
    p1.kArtikel, 
    p1.cName, 
    p1.cKurzBeschreibung, 
    p1.dLetzteAktualisierung, 
    p1.dErstellt, 
    p1.cSeo,
    p2.kartikelpict,
    p2.nNr,
    p2.cPfad  
FROM 
    tartikel AS p1 INNER JOIN tartikelpict AS p2 
    ON p1.kArtikel = p2.kArtikel
WHERE
  DATE(dErstellt) > (NOW() - INTERVAL 7 DAY)
  AND p2.nNr = 1
ORDER BY 
  p1.kArtikel DESC
LIMIT
    100;
 6
Author: fthiella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 20:14:48