[sql] 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을 추가하지 않고 (사용자가 선택했기 때문에)



답변

이 필드 dob에는 아마도 시간 구성 요소가 있습니다.

잘라 내기 :

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


답변

로부터 MySQL을 수동 :

이는 표현식과 같습니다 (최소 <= expr AND expr <= max)


답변

문제는 2011-01-31이 실제로 2011-01-31 00:00:00이라는 것입니다. 그것은 하루의 시작입니다. 낮에는 모든 것이 포함되지 않습니다.


답변

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


답변

쿼리에서 참조하는 필드가 날짜 유형 또는 날짜 시간 입니까? 유형입니까?

설명하는 동작의 일반적인 원인은 실제로 날짜 유형을 사용해야하는 DateTime 유형을 사용할 때입니다. 즉, 누군가가 태어난 시간을 정말로 알아야 할 필요가 없다면 날짜 유형을 사용하십시오.

마지막 날이 결과에 포함되지 않는 이유는 쿼리에서 쿼리에 지정하지 않은 날짜의 시간 부분을 쿼리가 가정하는 방식입니다.

즉, 쿼리는 2011-01-30과 2011-01-31 사이의 자정까지 해석되지만 2011-01-31의 하루 후일에 데이터에 값이있을 수 있습니다.

제안 : 날짜 / 시간 유형 인 경우 필드를 날짜 유형으로 변경하십시오.


답변

안녕하세요,이 질문은 저에게 효과적입니다.

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


답변

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

놀랍게도 이러한 변환은 MySQL의 많은 문제에 대한 솔루션입니다.