Я использую следующий запрос для предназначения для результатов, которые являются точно X днями, более старыми, чем текущее время.
SELECT *,
DATE_FORMAT(datetime, '%m/%d/%Y')
FROM table
WHERE datetime BETWEEN SYSDATE() - INTERVAL 30 DAY
AND SYSDATE()
ORDER BY ID DESC
Проблемой являются свои данные возврата с текущего дня, если запись точно от 30 дней назад не существует, а также несоответствующие данные
существует ли лучший способ сделать это?
BETWEEN
включает все значения между двумя аргументами, включая значения на каждом конце. Другими словами, МЕЖДУ 1 И 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 ()
возвращает дату без компонента времени .
Ваш запрос настроен на получение записей между сегодняшним днем (включая время) и 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