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

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

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

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

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

10
задан OMG Ponies 19 July 2010 в 17:28
поделиться

2 ответа

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

31
ответ дан 3 December 2019 в 13:40
поделиться

Ваш запрос настроен на получение записей между сегодняшним днем ​​(включая время) и 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
12
ответ дан 3 December 2019 в 13:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: