Выбор записей в mysql db от 1, 7 и 30 дней назад с datetime и php

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

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

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

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

Ответ 1

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() возвращает дату без компонента времени.

Ответ 2

Ваш запрос настроен на получение записей между сегодняшним днем ​​(включая время) и 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