SQL : BETWEEN 대 <= 및> =


111

SQL Server 2000 및 2005 :

  • 이 두 WHERE절의 차이점은 무엇 입니까?
  • 어떤 시나리오에서 어떤 것을 사용해야합니까?

쿼리 1 :

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate BETWEEN '10/15/2009' AND '10/18/2009'

쿼리 2 :

SELECT EventId, EventName
FROM EventMaster
WHERE EventDate >='10/15/2009'
  AND EventDate <='10/18/2009'

(편집 : 두 번째 Eventdate가 원래 누락되었으므로 쿼리 구문이 잘못되었습니다.)



6
실제로는 날짜 시간 처리가 약간 다르며 SQL Server 2008의 경우였으며 Shyju는 대답이 이전 버전과 동일 할 것인지 묻지 않고는 확신 할 수 없습니다.
Irfy

답변:


119

그것들은 동일합니다 : BETWEEN질문에서 더 긴 구문의 속기입니다.

BETWEEN예를 들어 작동하지 않는 다른 긴 구문을 사용하십시오.

Select EventId,EventName from EventMaster
where EventDate >= '10/15/2009' and EventDate < '10/18/2009'

( 두 번째 조건이 <아닌 참고 <=.)


19
두 번째 조건이 '<'라는 점을 강조해야 할 수도 있습니다. 차이점을 발견하는 데 시간이 좀 걸렸습니다.
zendar

21
DATE 데이터 유형을 다루거나 datetime 값에 시간 구성 요소가 없다는 것을 보장하지 않는 한 BETWEEN을 사용하지 않는 것이 좋습니다. 이에 대해 일관성을 유지하면> = 및 <대신 실수로 BETWEEN을 사용할 가능성이 줄어들고, 의도하지 않은 쿼리에서 일부 데이터를 얻거나 하루를 더 받고 있다고 생각할 수 있습니다. 데이터가 아닐 때 ...
Aaron Bertrand

1
BETWEEN이 조건부로 변환 될 때 두 번째 컴파일러 단계가 있습니까? 나는 이것이 약간 현학적 인 것임을 이해하지만 추가 오버 헤드가 있습니까?
James Scott

1
@xmashallax 때문에? 어떻게되지 않습니까?
Tony Andrews

2
이상한 ... 내가 질문 혼란을 얻었다 고 생각, 대답, 의견 및 내 코드는 분명히 = 지금은 버그가 있다는 사실)의 쓰기
xmashallax

37

그들은 동일합니다.

주의해야 할 사항은 DATETIME에 대해 이것을 사용하는 경우 종료 날짜에 대한 일치가 하루의 시작이됩니다.

<= 20/10/2009

다음과 같지 않습니다.

<= 20/10/2009 23:59:59

(그것은 에 대해 일치 <= 20/10/2009 00:00:00.000)


이 경우 '2009-10-20'과 '2009-10-21'사이를 사용하여 하루를 캡처 할 수 있습니다
David Andrei Ned

4
@DavidAndreiNed도 '2009-10-21 00 : 00 : 00.000'과 일치합니다.
Hans Ke st ing

2
필드 BETWEEN '2009-10-20 00:00:00'및 '2009-10-20 23:59:59'또는 필드> = '2009-10-20 00:00:00'AND 필드 <= '2009-10-20 23:59:59'는 확실합니다.
geilt

@geilt 귀하의 예제는 하루의 마지막 초 내에 발생한 모든 것을 놓칠 것입니다. 즉, 다음 날 23:59:59에서 00:00:00 사이에 발생했습니다.
Seth Flowers

00:00:00은 다음 날의 시작이며> 또는 <이 아닌> = 및 <=를 사용하는 이유입니다. 그러나 마이크로 초를 의미하고 저장하는 경우 마지막 및 마지막 마이크로 초도 입력 할 수 있습니다.
geilt

14

하지만 BETWEEN읽기 및 유지 관리가 쉽다는 폐쇄 간격 이전에 언급 한 바와 같이이 기간에 문제가 될 수 있기 때문에, 나는 거의 사용을 권장하지 않습니다 - 심지어 시간 구성 요소없이.

예를 들어, 월별 데이터를 처리 할 때 날짜를 비교 BETWEEN first AND last하는 것이 일반적이지만 실제로는 작성하기가 더 쉽습니다 dt >= first AND dt < next-first(시간 부분 문제도 해결됨). 결정은 last일반적으로 결정 next-first(하루 빼기) 보다 한 단계 더 길기 때문 입니다. .

또한, 하한과 상한을 올바른 순서 (예 :)로 지정해야한다는 또 다른 문제점이 있습니다 BETWEEN low AND high.


4

일반적으로 차이가 없습니다. BETWEEN키워드가 모든 RDBMS 플랫폼에서 지원되는 것은 아니지만 지원되는 경우 두 쿼리가 동일해야합니다.

똑같기 때문에 속도 나 그 밖의 다른 점에서 구분이 없습니다. 더 자연스러운 것을 사용하십시오.


4

@marc_s, @Cloud 등이 언급했듯이. 그들은 기본적으로 닫힌 범위에 대해 동일합니다.

그러나 어떤 분수 시간 값 (큰 또는 동등 및 닫힌 영역에 문제가 발생할 수 미만 또는 동등 (큼 동등 또는 반 개방 범위와는 대조적으로) 보다 작음 최종 값) 이후를 오는 . 가능한 마지막 순간.

따라서 쿼리를 다음과 같이 다시 작성하지 않으려면

SELECT EventId, EventName
  FROM EventMaster
 WHERE (EventDate >= '2009-10-15' AND
        EventDate <  '2009-10-19')    /* <<<== 19th, not 18th */

BETWEEN반 개방 간격으로 작동하지 않기 때문에 오류 일 가능성이 있으므로 항상 사용하는 날짜 / 시간 쿼리를 자세히 살펴 봅니다.


4

나는 당신이 범위에 대해 한 필드를 확인BETWEEN 하고 있다는 것을 독자에게 즉시 명확하게 하기 때문에 약간 선호 한다 . 테이블에 유사한 필드 이름이있는 경우 특히 그렇습니다.

예를 들어 테이블에 a transactiondate와 a 가 모두있는 transitiondate경우

transactiondate between ...

나는 테스트의 양쪽 끝이이 한 분야에 반대한다는 것을 즉시 알고 있습니다.

내가 읽으면

transactiondate>='2009-04-17' and transactiondate<='2009-04-22'

두 필드가 동일한 지 확인하려면 시간을 좀 더 들여야합니다.

또한 시간이 지남에 따라 쿼리가 편집되면 조잡한 프로그래머가 두 필드를 분리 할 수 ​​있습니다. 다음과 같은 쿼리를 많이 보았습니다.

where transactiondate>='2009-04-17'
  and salestype='A'
  and customernumber=customer.idnumber
  and transactiondate<='2009-04-22'

BETWEEN물론을 사용하여 시도하면 구문 오류가 발생하고 즉시 수정됩니다.


3

유일한 차이점은 각 쿼리에 대한 구문 적 설탕의 양이라고 생각합니다. BETWEEN은 두 번째 쿼리와 정확히 동일하게 말하는 매끄러운 방법입니다.

내가 알지 못하는 RDBMS 특정 차이점이있을 수 있지만 실제로는 그렇게 생각하지 않습니다.


2

논리적으로 전혀 차이가 없습니다. 성능면에서-일반적으로 대부분의 DBMS에서-전혀 차이가 없습니다.



1

면책 조항 : 아래의 모든 것은 일 화일 뿐이며 제 개인적인 경험에서 직접 가져온 것입니다. 좀 더 경험적으로 엄격한 분석을 수행하는 것에 동의하는 사람은 누구나 그것을 수행하고 내가 있다면 반대 투표를 할 수 있습니다. 또한 SQL이 선언적 언어라는 것을 알고 있으며 코드를 작성할 때 코드가 처리되는 방식을 고려할 필요가 없지만 제 시간을 소중히 여기기 때문에 그렇습니다.

논리적으로 동등한 문장이 무한하지만 세 가지 (ish)를 고려할 것입니다.

사례 1 : 표준 순서로 두 개의 비교 (평가 순서 고정)

A> = MinBound AND A <= MaxBound

사례 2 : Syntactic sugar (평가 순서는 저자가 선택하지 않음)

MinBound와 MaxBound 사이

사례 3 : 교육 된 순서로 두 가지 비교 (작성시 평가 순서 선택)

A> = MinBound AND A <= MaxBound

또는

A <= MaxBound AND A> = MinBound

내 경험상 사례 1과 사례 2는 데이터 세트를 무시하기 때문에 성능면에서 일관되거나 눈에 띄는 차이가 없습니다.

그러나 사례 3은 실행 시간을 크게 향상시킬 수 있습니다. 특히, 대규모 데이터 세트로 작업하고 AMaxBound 보다 크거나 MinBound 보다 작은 지 여부에 대한 경험적 지식 이있는 경우 는 비교 사례 3을 사용하고 주문하여 눈에 띄게 실행 시간을 향상시킬 수 있습니다 따라서.

한 가지 사용 사례는 특정 간격 내의 레코드에 대해 인덱싱되지 않은 날짜가있는 대규모 기록 데이터 세트를 쿼리하는 것입니다. 쿼리를 작성할 때 지정된 간격 이전 또는 지정된 간격 이후에 더 많은 데이터가 존재하는지 여부를 알 수 있으며 이에 따라 비교를 정렬 할 수 있습니다. 데이터 세트의 크기, 쿼리의 복잡성, 첫 번째 비교에서 필터링 된 레코드의 양에 따라 실행 시간이 절반으로 단축되었습니다.


음, 뭐? 사례 3은 사례 1 및 사례 2와 동일한 논리를 공유하지 않습니다. A두 경계보다 큰지 확인하려면 A이 값이보다 큰지 확인하십시오 MaxBound. 게시물을 조정해야합니다.
mickmackusa

평등 연산자를 오타 한 것 같습니다. 잘 잡았습니다.
LanchPad

0

이 시나리오에서 col BETWEEN ... AND ...col <= ... and col >= ...동일합니다.


SQL Standard는 T461 Symmetric BETWEEN 술어 도 정의합니다 .

 <between predicate part 2> ::=
 [ NOT ] BETWEEN [ ASYMMETRIC | SYMMETRIC ]
 <row value predicand> AND <row value predicand>

Transact-SQL은이 기능을 지원하지 않습니다.

BETWEEN값을 정렬해야합니다. 예를 들면 :

SELECT 1 WHERE 3 BETWEEN 10 AND 1
-- no rows

<=>

SELECT 1 WHERE 3 >= 10 AND 3 <= 1
-- no rows

반면에 :

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 1 AND 10;
-- 1

SELECT 1 WHERE 3 BETWEEN SYMMETRIC 10 AND 1
-- 1

정상과 똑같이 작동 BETWEEN하지만 비교 값을 정렬 한 후에 작동 합니다.

db <> 바이올린 데모

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.