получить данные между двумя датами - PullRequest
0 голосов
/ 27 февраля 2012

Я использую базу данных MySql. и я выполняю запрос так:

select * 
from Request
where 
DATE_FORMAT(created_On,'%e/%m/%Y') between DATE_FORMAT(CURDATE() - 30, '%e/%m/%Y') and DATE_FORMAT(CURDATE(),'%e/%m/%Y')

будет возвращено пустое значение, что означает отсутствие записей в результате.

но если я напишу так

select * 
from Request
where 
DATE_FORMAT(created_On,'%e/%m/%Y') between DATE_FORMAT(CURDATE() - 27, '%e/%m/%Y') and DATE_FORMAT(CURDATE(),'%e/%m/%Y')

Получит 100 сотен строк.

Я хочу спросить, почему я отнимал 30 дней от текущей даты?

Ответы [ 3 ]

3 голосов
/ 27 февраля 2012

Предполагая, что ваши столбцы даты являются правильными DATETIME или DATE полями, вы не должны использовать DATE_FORMAT(). Используйте DATE_SUB() для вычитания 30 дней:

Если created_On равно DATETIME, используйте DATE() для усечения временной части:

SELECT * 
from Request
where 
  DATE(created_On) BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND CURDATE()

Если created_On равно DATE, просто используйте:

SELECT * 
from Request
where 
  created_On BETWEEN DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND CURDATE()
1 голос
/ 27 февраля 2012

Вы также можете использовать функцию TO_DAYS для дат, которая позволяет сравнивать поля даты и времени:

SELECT * from Request
where TO_DAYS(created_On) BETWEEN TO_DAYS(DATE_SUB(CURDATE(), INTERVAL 30 DAY)) AND TO_DAYS(CURDATE()) 
0 голосов
/ 27 февраля 2012

Можете ли вы хотя бы сначала опубликовать образец ваших данных и сначала определить created_on, чтобы мы могли провести надлежащий анализ вашего вопроса? Потому что, если честно, при использовании между первым допущением было бы created_on будет иметь тип даты, но опять же функция date_format преобразует вашу дату в строку, поэтому использование между строкой в ​​качестве значения будет иметь другой результат, чем используя между с датой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...