세미 오픈 (또는 반 오픈 반 폐쇄 , 하프 경계 () 간격 [a,b)
, x
간격 IFF에 속한다는 a <= x < b
그들이 많은 편리한 특성을 가지고), 프로그래밍에 꽤 일반적인이다.
누구나 SQL BETWEEN
이 닫힌 간격 ( [a,b]
)을 사용하는 이유를 설명하는 이론적 근거를 제공 할 수 있습니까 ? 이것은 esp입니다. 날짜가 불편합니다. 왜 이렇게 BETWEEN
행동 했을 까요?
세미 오픈 (또는 반 오픈 반 폐쇄 , 하프 경계 () 간격 [a,b)
, x
간격 IFF에 속한다는 a <= x < b
그들이 많은 편리한 특성을 가지고), 프로그래밍에 꽤 일반적인이다.
누구나 SQL BETWEEN
이 닫힌 간격 ( [a,b]
)을 사용하는 이유를 설명하는 이론적 근거를 제공 할 수 있습니까 ? 이것은 esp입니다. 날짜가 불편합니다. 왜 이렇게 BETWEEN
행동 했을 까요?
답변:
포용성 BETWEEN
이 반 오픈 간격보다 직관적이고 SQL 디자이너도 마찬가지 라고 생각합니다 . 예를 들어, "1에서 10 사이의 숫자를 선택하십시오"라고 말하면 대부분의 사람들은 숫자 1과 10을 포함합니다. 개방형 간격은 비대칭이기 때문에 비 개발자에게는 실제로 혼란 스럽습니다. 프로그래머가 아닌 사람이 SQL을 사용하여 간단한 쿼리를하는 경우가 종종 있으며, 반 오픈 시맨틱은 훨씬 혼란 스러웠습니다.
질문 : 왜 SQL이 BETWEEN에 포함됩니까?
답변 : SQL 언어 디자이너가 잘못된 디자인 결정을 내렸기 때문에 개발자가 BETWEEN의 4 가지 변형 (폐쇄, 준 오픈 왼쪽, 반 오픈 오른쪽 또는 오픈)을 지정할 수있는 구문을 제공하지 못했습니다. ) 선호합니다.
권장 사항 : SQL 표준이 수정되지 않는 한 날짜 / 시간에 BETWEEN을 사용하지 마십시오. 대신 DATE 범위 비교를 BETWEEN 범위의 시작 및 끝 경계에서 독립적 인 조건으로 코딩하는 습관을 가지십시오. 이것은 조금 장황하지만, 직관적 인 (따라서 버그가 적을 것임) 데이터베이스 최적화 프로그램에 명확한 조건을 작성하여 최적의 실행 계획을 결정하고 색인을 사용할 수 있습니다.
예를 들어 쿼리에서 입력 날짜 사양을 수락하고 해당 날짜에 해당하는 모든 레코드를 반환해야하는 경우 다음과 같이 코딩됩니다.
WHERE DATE_FIELD >= :dt AND DATE_FIELD < :dt+1
BETWEEN을 사용하여 논리를 작성하려고하면 성능 문제 및 / 또는 버그가있는 코드가 발생할 수 있습니다. 세 가지 일반적인 실수 :
1) WHERE DATE_FIELD BETWEEN :dt AND :dt+1
이것은 거의 확실히 버그입니다. 사용자는 특정 날짜의 레코드 만 볼 것으로 예상하지만 하루는 다음 날 오전 12시의 레코드가 포함 된 보고서와 함께 시작됩니다.
2) WHERE TRUNC(DATE_FIELD) = :dt
정답을 제공하지만 DATE_FIELD에 함수를 적용하면 대부분의 인덱싱 / 통계가 쓸모 없게됩니다 (그러나 DBA가 날짜 필드에 함수 기반 인덱스를 추가하여 여전히 작업 시간과 디스크 공간을 태우고 IUD에 오버 헤드를 추가하여 도움을 줄 수 있지만) 테이블 작업)
삼) WHERE EVENT_DATE BETWEEN :dt AND :dt + 1-1/24/60/60
오라클의 전문가 인 Tom Kyte는 이보다 덜 우아한 (IMO) 솔루션을 권장합니다. 불완전한 결과를 제공하는 쿼리에서 "1-1 / 24 / 06 / 60"을 찾거나 실수로 TIMESTAMP 필드에서 사용할 때까지 하루 종일 보낼 때까지 훌륭하게 작동합니다. 또한 약간 독점적입니다. Oracle의 DATE 데이터 유형 (두 번째 추적)과 호환되지만 다른 데이터베이스 제품의 DATE / TIME 정밀도로 조정해야합니다.
솔루션 : CLOSED / INCLUSIVE 기본값에 대한 대안의 스펙을 지원하도록 BETWEEN 구문을 수정하여 SQL 언어 스펙을 향상 시키도록 ANSI SQL위원회에 탄원하십시오. 이와 같은 것이 트릭을 수행합니다.
expr1 expr2 사이 [ INCL [USIVE] | EXCL [USIVE]] 및 expr3 [ INCL [USIVE] | 독점 [USIVE]]
이 표현되고 얼마나 쉽게 고려 WHERE DATE_FIELD BETWEEN :dt INCLUSIVE AND :dt+1 EXCLUSIVE
(또는 WHERE DATE_FIELD BETWEEN :dt AND :dt+1 EXCL
)
아마도 ANSI SQL : 2015?
exp1 BETWEEN exp2 AND exp3 AND exp1 != exp3
으로 연산자 사이를 유지하여 원거리 술어임을 알 수 있으며 부등식 술어는 반 열린 것을 보장합니다.
포함 ( a <= x <= b
)과 독점 ( a < x < b
)은 거의 동일하므로 표준을 만들 때 단순히 하나를 선택해야했습니다. 공통 영어에서 "사이"는 일반적으로 포함되며, SQL 문은 영어 문장과 유사하게 읽히도록되어 있기 때문에 합리적인 선택이 적절했습니다.
a <= x < b
Half-Open입니다.
연산자는이라고 불리지 않고 이므로 ∩[a,b)
라는 BETWEEN
의미 는 수학적 술어 "반간 간격"에있는 것보다 영어 구문 "사이에 있음" 의 의미 인 것이 훨씬 더 적합합니다 .
BETWEEN
연산자 가 영어 사이에 "is between"라는 의미를 사용 하지 않는다는 것입니다. 영어에서 "사이"는 사물 을 구분 하는 시간, 공간 또는 간격 입니다 (예 : 배타적 ). 당신이 목표를 걷어차려고하면 공이 득점 사이에 이동해야합니다. 당신이 그들 사이를 통과하지 못한 게시물을 명중하면-당신을 위해 점수가 없습니다.