Как выбрать все записи за последний месяц? - PullRequest
2 голосов
/ 02 июня 2010

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

Я пытался:

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

... безуспешно

Ответы [ 3 ]

3 голосов
/ 02 июня 2010

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

SELECT * FROM `registries` 
 WHERE `reg_date` > DATE_SUB( NOW(), INTERVAL 30 DAY )
1 голос
/ 02 июня 2010

На основании запроса OMG Ponies с исправлениями:

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')

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

С другой стороны, вы, вероятно, могли бы запустить его быстрее, запросив сначала 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.

0 голосов
/ 02 июня 2010

Это даст вам все записи за последний месяц (май):

ВЫБРАТЬ [col,] DATEDIFF (TIMESTAMP, 2010-05-01 00:00) dif1, DATEDIFF (TIMESTAMP, 2010-05-31 00:00) dif2 FROM tablename HAVING dif1> = 0 AND dif2 <= 0 </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...