MySQL "между" не включительно?

Если я запускаю запрос с предложением between, он, кажется, исключает конечное значение.
Например:

select * from person where dob between '2011-01-01' and '2011-01-31'

Получает все результаты с dob от '2011-01-01' до '2011-01-30'; пропускать записи, где dob - '2011-01-31'. Может ли кто-нибудь объяснить, почему этот запрос ведет себя таким образом, и как я могу его изменить, чтобы включить записи, где dob есть "2011-01-31"? (без добавления 1 к конечной дате, потому что он был выбран пользователями.)

Ответ 1

Поле dob, вероятно, имеет компонент времени.

Чтобы усечь его:

select * from person 
where CAST(dob AS DATE) between '2011-01-01' and '2011-01-31'

Ответ 3

Проблема в том, что 2011-01-31 действительно 2011-01-31 00:00:00. Это начало дня. Все в течение дня не включено.

Ответ 4

select * from person where dob between '2011-01-01 00:00:00' and '2011-01-31 23:59:59'

Ответ 5

Является ли поле, в котором вы указываете в своем запросе тип Дата или тип DateTime?

Общей причиной описанного поведения является использование типа DateTime, в котором вы действительно должны использовать тип даты. То есть, если вам действительно не нужно знать, в какое время кто-то родился, просто используйте тип даты.

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

То есть: ваш запрос интерпретируется до полуночи между 2011-01-30 и 2011-01-31, но данные могут иметь значение когда-то позже в день 2011-01-31.

Предложение: измените поле на тип даты, если это тип DateTime.

Ответ 6

Привет, этот запрос работает для меня,

select * from person where dob between '2011-01-01' and '2011-01-31 23:59:59'

Ответ 7

select * from person where DATE(dob) between '2011-01-01' and '2011-01-31'

Удивительно, но такие преобразования являются решением многих проблем в MySQL.

Ответ 8

Установите верхнюю дату на дату + 1 день, поэтому в вашем случае установите ее в 2011-02-01.