Zapytanie MySQL - rekordy od dzisiaj do ostatnich 30 dni

122

Chcę zwrócić wszystkie rekordy, które zostały dodane do bazy danych w ciągu ostatnich 30 dni. Muszę przekonwertować datę na mm / dd / rr ze względu na wyświetlanie.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Mój wyciąg nie ogranicza rekordów do ostatnich 30 dni - wybiera wszystkie rekordy.

Czy ktoś może wskazać mi właściwy kierunek? Czuję, że jestem blisko.

Dzięki i życzę miłego tygodnia.

Jason Sweet
źródło

Odpowiedzi:

294

Musisz złożyć wniosek DATE_FORMATw SELECTklauzuli, a nie w WHEREklauzuli:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Należy również pamiętać, że CURDATE()zwraca tylko DATEczęść daty, więc jeśli zapiszesz create_datejako DATETIMEz wypełnioną częścią czasu, to zapytanie nie wybierze dzisiejszych rekordów.

W takim przypadku musisz użyć NOWzamiast tego:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
źródło
Druga część tej odpowiedzi jest bardzo ważna! Mogłem mieć ten problem lub nie, i drapałem się po głowie, dopóki nie wróciłem do tej odpowiedzi.
Tyler Lazenby
@Quassnoi Przepraszam. Wygląda na to, że problem dotyczy tylko przygotowania WordPress \ wpdb. Jeszcze raz przepraszam.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
źródło
2
Wolę tę metodę niż BETWEEN CURDATE () - INTERVAL 30
Dan
1
@ErmWięc mogę wiedzieć, dlaczego?
slim
3
Nie będę kłamać - to było 2 lata temu i nie pamiętam! Przepraszamy: P
Dan,
1
Nie trzeba używaćDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@Dan Wolę uczynić to bardziej czytelnym, umieszczając poprzednią datę w nawiasach: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMAT zwraca ciąg, więc używasz dwóch ciągów w swoim BETWEEN klauzuli , co nie będzie działać zgodnie z oczekiwaniami.

Zamiast tego przekonwertuj datę na swój format w formacie SELECTi BETWEENzastosuj daty rzeczywiste. Na przykład,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Rich Adams
źródło
9

Możesz również napisać to w mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

NAPRAWIONY

Rohit Suthar
źródło
2
Uwaga: pomimo głosów pozytywnych, to wybiera daty w kolejnych 30 dniach / miesiącu, a nie w ostatnich 30 dniach!
JonBrave
4
Uzgodnione, powinno być GDZIE create_date> DATE_ADD (NOW (), INTERVAL -1 MIESIĄC);
Bhavik P.
6

Użyj tego dla aktualnej daty i pełnej aktywności z poprzednich 30 dni, ponieważ SYSDATE jest zmienna w dniu, w którym poprzedni 30-ty dzień nie będzie zawierał pełnych danych z tego dnia.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
onlybymyexerience
źródło
1

Oto rozwiązanie bez użycia curdate()funkcji, jest to rozwiązanie dla tych, którzy używają TSQLChyba

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
źródło