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