Как выполнить запрос между двумя датами с помощью MySQL?

Следующий запрос:

SELECT * FROM `objects` 
WHERE (date_field BETWEEN '2010-09-29 10:15:55' AND '2010-01-30 14:15:55')

ничего не возвращает.

У меня должно быть более чем достаточно данных для того, чтобы запрос работал. Что я делаю неправильно?

Ответ 1

Ваша вторая дата до первой даты (т.е. вы запрашиваете между 29 сентября 2010 года и 30 января 2010 года). Попробуйте изменить порядок дат:

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

Ответ 2

Ваш запрос должен иметь дату как

select * from table between `lowerdate` and `upperdate`

попробовать

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

Ответ 3

Является ли date_field типа datetime? Также вам нужно сначала поставить дату для наушников.

Это должно быть:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')

Ответ 4

DATE() - это функция MySQL, которая извлекает только часть даты выражения даты или даты/времени

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';

Ответ 5

В качестве дополнения к ответу от @sabin и подсказки, если нужно сравнить только часть даты (без времени):

Если поле для сравнения относится к типу datetime и для сравнения указываются только даты, эти даты внутренне преобразуются в значения datetime. Это означает, что следующий запрос

SELECT * FROM 'objects' WHERE (date_time_field BETWEEN '2010-01-30' AND '2010-09-29')

будет преобразован в

SELECT * FROM 'objects' WHERE (date_time_field BETWEEN '2010-01-30 00:00:00' AND '2010-09-29 00:00:00')

внутренне.

Это, в свою очередь, приводит к результату, который не включает объекты 2010-09-29 со значением времени больше 00:00:00!

Таким образом, если все объекты с датой 2010-09-29 также должны быть включены, поле для сравнения должно быть преобразовано в дату:

SELECT * FROM 'objects' WHERE (DATE(date_time_field) BETWEEN '2010-01-30' AND '2010-09-29')

Ответ 6

Вы можете сделать это вручную, сравнивая с большим или равным и меньшим или равным.

 select * from table_name where created_at_column  >=   lower_date  and  created_at_column <= upper_date;

В нашем примере нам нужно получить данные за определенный день. Мы будем сравнивать с начала дня до последней секунды в другой день.

  select * from table_name where created_at_column  >=   '2018-09-01 00:00:00'  and  created_at_column <= '2018-09-05 23:59:59';

Ответ 7

Может возникнуть проблема с настройкой даты на стороне сервера или на стороне клиента. Я обнаружил, что это общая проблема в нескольких базах данных, когда хост настроен на испанский, французский или любой другой..., который может повлиять на формат dd/mm/yyyy или mm/dd/yyyy.

Ответ 8

Попробуйте включить даты:

2010-09-29 > 2010-01-30?

Ответ 9

Просто приведите поле даты как дату

SELECT * FROM 'objects' 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )

Ответ 10

При использовании значений даты и времени вы должны приводить поля как DateTime а не как Date. Пытаться:

SELECT * FROM 'objects' 
WHERE (CAST(date_field AS DATETIME) 
BETWEEN CAST('2010-09-29 10:15:55' AS DATETIME) AND CAST('2010-01-30 14:15:55' AS DATETIME))