Как я могу сделать запрос между двумя датами, используя MySQL?

225

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

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

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

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

NullVoxPopuli
источник
32
Будь осторожен с между ними, так как оба minи maxзначения считаются в диапазоне, чтобы не обрабатывать дважды дата , которая является либо minи maxзначение (крайний случай). Например, дата 2010-09-29 00:00:00будет между 2010-09-28 00:00:00и2010-09-29 00:00:00 , А ТАКЖЕ между 2010-09-29 00:00:00и2010-09-30 00:00:00
minipif
да, что он сказал ^^
Альберт Раннецпергер

Ответы:

472

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

SELECT *
FROM `objects`
WHERE (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Даниэль Вандерслуис
источник
Я знал это, но теперь есть проблема с ОБНОВЛЕНИЕМ. Я пытаюсь использовать МЕЖДУ для ОБНОВЛЕНИЯ, должно ли это работать так же?
Ингус
3
@IngusGraholskis: whereпредложение должно работать одинаково для операторов selectили update.
T30
Лично я нахожу термин «от» и «до» хитрым способом запоминания порядка, в котором должен быть написан запрос.
KeaganFouche
Как вернуть все данные, если обе даты нулевые или пустые?
Мир кодирования
23

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

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')
Nik
источник
20

Имеет date_fieldтип datetime? Также вам нужно поставить дату более раннего.

Так должно быть:

SELECT * FROM `objects` 
WHERE  (date_field BETWEEN '2010-01-30 14:15:55' AND '2010-09-29 10:15:55')
Ракета Хазмат
источник
17

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

SELECT * FROM table_name WHERE DATE(date_field) BETWEEN '2016-12-01' AND '2016-12-10';
Сабин
источник
Вы можете добавить объяснение, чтобы люди поняли, что вы делаете.
Франц Глайхманн
7

В качестве дополнения к ответу от @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')
ltlBeBoy
источник
4

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

 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';
Фахд Аллебди
источник
2

При использовании значений даты и времени вы должны приводить поля как, 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))
Бруно Баррал
источник
1

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

SoulWanderer
источник
3
Проблема заключалась в том, что более старая дата была указана до более новой даты.
тогдашний день,
1

Просто приведите date_field в качестве даты

SELECT * FROM `objects` 
WHERE (cast(date_field as date) BETWEEN '2010-09-29' AND 
'2010-01-30' )
DS Mercy
источник
0

Попробуйте поменять даты:

2010-09-29 > 2010-01-30?
Jure1873
источник