Programming

MySQL“사이”조항이 포함되지 않습니까?

procodes 2020. 6. 23. 22:10
반응형

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


상위 날짜를 날짜 + 1 일로 설정하므로 2011-02-01로 설정하십시오.


다음과 같이 쿼리를 실행할 수 있습니다.

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

날짜가 하드 코딩 된 경우 다른 사람들이 지적한 것처럼.

반면, 날짜가 다른 테이블에있는 경우 다음과 같이 날짜를 추가하고 초를 뺄 수 있습니다 (두 번째 / 시간없이 날짜가 저장된 경우).

select * from person JOIN some_table ... where dob between some_table.initial_date and (some_table.final_date + INTERVAL 1 DAY - INTERVAL 1 SECOND)

dob(응답 된 답변에서와 같이) Fiels 에 캐스트를하지 마십시오. 큰 성능 문제가 발생할 수 있습니다 ( dob필드 에서 인덱스를 사용할 수없는 경우). 또는 과 같은 것을 만들면 실행 계획이에서 (으) using index condition변경 될 수 있으므로주의하십시오!using whereDATE(dob)CAST(dob AS DATE)

참고 URL : https://stackoverflow.com/questions/5080824/mysql-between-clause-not-inclusive

반응형