Выбор записей в MySQL DB от 1, 7 и 30 дней назад с datetime и php - PullRequest
10 голосов
/ 19 июля 2010

Я использую следующий запрос для нацеливания на результаты, которые ровно на X дней старше, чем текущее время.

SELECT  *,
        DATE_FORMAT(datetime, '%m/%d/%Y') 
   FROM table 
  WHERE datetime BETWEEN SYSDATE() - INTERVAL 30 DAY 
                     AND SYSDATE() 
ORDER BY ID DESC

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

есть ли лучший способ сделать это?

Ответы [ 2 ]

30 голосов
/ 19 июля 2010

BETWEEN включает все значения между двумя аргументами, включая значение на каждом конце. Другими словами, BETWEEN 1 AND 4 включает значения 1, 2, 3 и 4. Не только 1 и 4 и не только 2 и 3.

Если вам нужны даты только одного дня, который 30 дней назад, попробуйте следующее:

SELECT  *,
        DATE_FORMAT(datetime, '%m/%d/%Y') 
   FROM table 
  WHERE DATE(datetime) = CURDATE() - INTERVAL 30 DAY 
ORDER BY ID DESC

Используйте CURDATE() вместо SYSDATE(), поскольку CURDATE() возвращает дату без компонента времени.

11 голосов
/ 19 июля 2010

Ваш запрос настроен на получение записей между сегодняшним днем ​​(включая время) и 30 днями ранее.

Если вы хотите, чтобы записи были старше 30 дней (до времени), используйте:

  SELECT *,
         DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
   WHERE datetime <= DATE_SUB(SYSDATE(), INTERVAL 30 DAY)
ORDER BY ID DESC

Если вы хотите, чтобы те были только 30 дней, а не 31 или 29, безуважение к временной части - используйте:

  SELECT *,
         DATE_FORMAT(datetime, '%m/%d/%Y') 
    FROM table 
   WHERE DATE_FORMAT(datetime, '%m/%d/%Y') = DATE_FORMAT(DATE_SUB(SYSDATE(), INTERVAL 30 DAY), '%m/%d/%Y') 
ORDER BY ID DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...