Если я запускаю запрос с предложением 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'
Ответ 2
Из MySQL-руководство:
Это эквивалентно выражению (min <= expr AND expr <= max)
Ответ 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.