Muszę zaznaczyć wszystkie wiersze w mojej bazie danych, które zostały utworzone w zeszłym miesiącu.
Na przykład, jeśli bieżącym miesiącem jest styczeń, chcę zwrócić wszystkie wiersze utworzone w grudniu, jeśli miesiącem jest luty, chcę zwrócić wszystkie wiersze utworzone w styczniu. Mam date_created
kolumnę w mojej bazy danych, która zawiera wykaz dat tworzone w tym formacie: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
obejmuje granice .. Będzie zawierać również aktualną datę. Dlaczego / jak to będzie ograniczone do wczoraj ?? Proszę rozwinąć?current_date
to nie dzisiaj, a przypadkowa data podana przez klienta?Oto inna alternatywa. Zakładając, że masz pole indeksowane
DATE
lubDATETIME
pole typu, należy użyć indeksu, ponieważ sformatowane daty zostaną przekonwertowane na typ przed użyciem indeksu. Po wyświetleniu za pomocą EXPLAIN powinieneś zobaczyćrange
zapytanie, a nieindex
zapytanie .SELECT * FROM table WHERE date_created >= DATE_FORMAT( CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01' ) AND date_created < DATE_FORMAT( CURRENT_DATE, '%Y/%m/01' )
źródło
STR_TO_DATE
wokół,DATE_FORMAT
więc zawsze ma do czynienia z obiektami daty.Jeśli nie ma przyszłych dat ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Przetestowany.
źródło
Alternatywnie do odpowiedzi hobodave
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Możesz osiągnąć to samo z EXTRACT, używając YEAR_MONTH jako jednostki, więc nie potrzebujesz AND, na przykład:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
źródło
YEAR_WEEK
odstępu czasowego , więc musiałbyś wrócić do odpowiedzi hobodave, jeśli potrzebujesz tygodni zamiast miesięcy.SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Powinno to zwrócić wszystkie rekordy z poprzedniego miesiąca kalendarzowego, w przeciwieństwie do zapisów z ostatnich 30 lub 31 dni.
źródło
Mimo że odpowiedź na to pytanie została już wybrana, wydaje mi się, że najprostsze będzie zapytanie
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
źródło
To zadziałało dla mnie (wybiera wszystkie rekordy utworzone w zeszłym miesiącu, niezależnie od dnia uruchomienia zapytania w tym miesiącu)
źródło
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
ten będzie mógł skorzystać z indeksu, jeśli data_created jest indeksowana, ponieważ nie stosuje żadnej funkcji transformacji do wartości pola.
źródło
Oto zapytanie, aby uzyskać rekordy z ostatniego miesiąca:
SELECT * FROM `tablename` WHERE `datefiled` BETWEEN DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) AND LAST_DAY( DATE_SUB( DATE( NOW( ) ) , INTERVAL 1 MONTH ) )
Pozdrawiam - saqib
źródło
Alternatywa z jednym warunkiem
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
źródło
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
źródło