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.
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.
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;
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