2010-06-01 2 views
2

У меня есть таблица с записями, которая имеет поле DATE. Каждая запись имеет отчетную дату. Я хотел бы выбрать все записи за последний месяц зарегистрирован в базе. Как?Как выбрать все записи за последний месяц?

Я пробовал:

SELECT * 
    FROM registries 
WHERE reg_date = DATE_FORMAT(MAX(reg_date), "%m")` 

... без успеха

+3

Последний календарный месяц? Непосредственные последние 30 дней? –

ответ

1

Based по запросу OMG пОНИ с поправками:

SELECT 
    r.* 
FROM 
    registries AS r 
JOIN (
    SELECT 
    MAX(t.reg_date) AS max_date 
    FROM 
    registries AS t) AS t 
ON DATE_FORMAT(t.max_date, '%Y-%m') = DATE_FORMAT(r.reg_date, '%Y-%m') 

хотя производительность запроса не было бы отлично, так как он будет работать инфу на двух расчетных значений. Я считаю, что он по-прежнему может действовать прилично, если вы не нажмете миллионы записей.

С другой стороны, вы могли бы, вероятно, запустить его быстрее, запрашивая первым для MAX (reg_date)

SELECT 
    CONCAT(DATE_FORMAT(MAX(r.reg_date), "%Y-%m"), '-01') AS first_day 
FROM 
    registries AS r 

И затем вводя результат в запросе:

SELECT 
    r.* 
FROM 
    registries AS r 
WHERE 
    r.reg_date BETWEEN '<first_day>' AND LAST_DAY('<first_day>') 

С first_day как место для предыдущего результата запроса. Если вы указали reg_date, это должно выполняться довольно быстро.

Примечание: LAST_DAY - это только функция MySQL.

3

Если вы хотите, за последние 30 дней, это будет работать

SELECT * FROM `registries` 
WHERE `reg_date` > DATE_SUB(NOW(), INTERVAL 30 DAY) 
+0

Это. Использовать это. – Entendu

0

Это даст вам все записи за прошлый месяц (Май):

ВЫБЕРИТЕ [col,] DATEDIFF (ТШЕЗТАМР, 2010-05-01 00:00) dif1, DATEDIFF (ТШЕЗТАМР, 2010-05-31 00:00) dif2 ОТ TABLENAME HAVING dif1> = 0 И dif2 < = 0

Смежные вопросы