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의 많은 문제에 대한 솔루션입니다.