2014-09-18 2 views
0

그때이 문where 절에서 "And"와 "Between"을 사용하면 어떤 차이가 있습니까?

DECLARE @FirstDayofPrevMonth datetime 
SET @FirstDayofPrevMonth = DATEADD(mm, DATEDIFF(m,0,GETDATE())-1,0) 
DECLARE @LastDayofPrevMonth datetime 
SET @LastDayofPrevMonth = DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) 

을 사용하고 그래서 같이 where 절을 사용하여 :

WHERE FNDate >= @FirstDayofPrevMonth AND FNDate <= @LastDayofPrevMonth 

은 무엇 "사이"를 사용하는 이유가 될 것인가?

+0

사이 : 올바른 결과를 얻을 것이다 시간은, 다음 사용하는 것이 훨씬 더 안전 입니다 . 이것을 확인하십시오 : http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx. –

+1

'FNDate'에 대해 걱정할 타임 스탬프가 있습니까? 그때 사이에 예상대로 작동하지 않습니다.'FNDate <@LastDayofPrevMonth + 1'이 필요합니다. –

+1

'BETWEEN'에 대한 내 게시물을 읽는 것 외에도 [매우 자세히 읽어보십시오.] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-for-date-time-operations를 사용합니다.aspx) (게으른 속기를 사용하지 말 것) 또한 염두에 두라 (이 'DATEDIFF' 계산에 대해 어떻게 카디널리티가 결정되는지에 대한 버그가 있음) (http://sqlperformance.com/2013/09/t-sql-queries/datediff -곤충). –

답변

2

표시 할 경우에는 BETWEEN을 사용할 이유가 전혀 없습니다.이 두 표현식은 기능적으로 동일합니다.

좌측의 값은 예

WHERE @AsOfDate BETWEEN t.ActiveFrom AND t.ActiveTo 

또는 여기

WHERE DATEADD(day, t.DaysToDeliver, t.OrderDate) BETWEEN @BlackoutBegin AND @BlackoutEnd 

들면 식, 또는 매개 변수에 대한 참조를 평가 한 결과 인 경우 BETWEEN위한 좋은 경우는, >=<=의 동등한 쌍은 WHERE 절의 반복 부분을 필요로하며 이는 BETWEEN 연산자만큼 읽을 수 없습니다.

+2

명시 적으로 암시 적보다 낫다는 논쟁이 항상 있음에도 불구하고 필자는 동의한다. 한편으로는 foo> = bar와 foo <= woo는 foo보다 읽고 foo보다 많은 텍스트이지만 다른 한편으로는 BETWEEN은 INCLUSIVE라는 것을 기억하십시오. 적어도 조건문은 매우 명시 적으로 만듭니다. –

0

기억 하듯이 차이는 없습니다. 그러나 만약 자신에 대한 참조 :

SELECT * FROM `table` WHERE `date` BETWEEN 12917700 AND 12917300 
and: 


SELECT * FROM `table` WHERE `date` >= 12917700 AND `date` <= 12917300 

이 동일한 결과를 생성합니다.

+0

왜 MySQL 구문을 사용하고 있습니까? 귀하의 주위 엔티티가 SQL Server에 대해 올바르지 않습니다. 사용하는 정수가 예상대로 작동하지 않을 것이라고 확신합니다 (또는 완전히 혼란 스럽습니다). –

2

차이점은 거의 없으며 읽기 쉽다고 주장 할 수 있습니다.

예를 들어, 사람들은 그것을 주장 할 수 :

SELECT column_name(s) 
FROM table_name 
WHERE column_name BETWEEN value1 AND value2; 

보다 쉽게 ​​읽을 수있다 : 그렇지 않으면

SELECT column_name(s) 
FROM table_name 
WHERE column_name >=value1 AND column_name <=value2; 

, 정확히 큰 차이가 없습니다. 더 많은 타이핑을 제외하고, 물론 (감사합니다 Jake);)

어떤 사람들은 'BETWEEN'절이 맘에 들지 않지만, 때로는 날짜 등으로 까다로울 수 있기 때문에 동의하지 않을 것입니다. 그러나, 모든 코드와 마찬가지로, 그것은 이유를 위해 설계되었습니다. 그리고, 제대로 사용하면 매우 도움이 될 수 있습니다!

일부 사람들은 주야간에 AND 절을 사용한다고 주장 할 것입니다. 그리고 그것은 더 자주 사용하는 것을 알고/사용하고, 약간의 개조와 twerks에 익숙해있을 수 있습니다. BETWEEN 문을 많이 사용하지 않았습니다.

그러나 BETWEEN 문을 먼저 사용했다면 (AND 문이 무엇인지 알기 전에) 그들은 다르게 논쟁 할 것입니다.

다시 말하지만, 모든 코드 에서처럼 충분히 사용하면 사용법을 배울 수 있습니다. '어떻게 이전에이 코드를 사용하지 않았습니까?'라고 생각할 수도 있습니다.

편집

분명히 어떤 사람들이 무엇에 관해 얘기로 I (아래 내 댓글에서 복사) 나는이를 추가 할 수 있습니다 생각 '을가 포함/제외 않습니다'

적은 입력은 항상 수도 있지 초보자를위한 대답이 되라. 그러나 그들이하고있는 것을 알고있는 누군가, 그것은 매우 도움이 될 수있다! (나는 어떤 수단으로도 프로가 아니다) - 그러나 나에게는 배타적이라고 암시한다. 그러나 예, 나는 사람들이 어디에서 왔는지 이해합니다. 예를 들면 1과 10 사이의 숫자를 고르는 것과 같은 예를들 수 있습니다. 영어로 된 전체 단어는 모호한 부분이 있습니다 !!! :

당신이 더 읽고 싶다면

은 약 "잘못 처리 날짜/범위 쿼리를 걷어차 나쁜 습관"을 이야기하고 blog 게시물이 있습니다.

This

에 관한 약간의 explaination를 제공합니다 개인적으로

"구문과 예제 조건 사이의 SQL을 사용하는 방법에 대해 알아"나는, 직원 ID의 말에 대한 사이 이상을 사용 예약하는 것을 선호 여기서 값은 날짜가 아닌 int/etc입니다 (두 가지 모두 '괜찮습니다'라는 의미이므로이 설정은 순수한 기본 설정입니다).

+0

당신은'> ='와'<='가 필요합니다. –

+0

@GiannisParaskevopoulos 편집 됨. 그래도 그것을 지적 해 주셔서 감사합니다 :) – jbutler483

+2

또한 옵션 하나 덜 입력하고 있습니다. 항상 더하기. – Jake

2

는 및 < = 또는> =의 키워드 에는 차이가 없다. 그들은 같은 결과를 줄 것이다. 그러나 그 사이는 읽기 쉽기 때문에 열 이름도 반복하지 않습니다.

select * from table_name where column_name between '2014-01-01' and '2014-01-31'; 

select * from table_name where column_name>='2014-01-01' and date<='2014-01-31'; 

당신은 그들이 같은 결과를 줄 것이다 위의 쿼리에서 그것을 볼 수 있지만 사이 이 읽을 수있는 형식입니다.

4

BETWEEN>=<=과 실질적으로 동일합니다.

입력이 적 으면 잘못된 결과가 발생할 수 있습니다.

여러 번 한 번에 결과를 얻고 싶습니다. 당신은 작성합니다

이 경우
WHERE DateTimeField BETWEEN '20140918' AND '20140919' 

, 다음과 같은 테이블에 항목이 있다고 할 수 있습니다 : 항목 1과 2를 얻을 것

1 '20140918 23:59:59' 
2 '20140919 00:00:00' 
3 '20140919 00:00:01' 

where 문 그래서 비록 대부분의 혼란 스러울 수, 날짜/날짜 시간에 대한

WHERE DateTimeField >='20140918' AND DateTimeField < '20140919' 
+1

그러나 특정 날짜를 원하면 ** date where = **를 사용하지 않을까요? 날짜보다는 오히려? – jbutler483

+1

@ jbutler483 테이블의 필드가'DATETIME' 타입이라면 성능에 영향을 미치기 때문에'DATE' 타입으로'CONVERT' 또는'CAST'하면됩니다. '20140918'은 절대로 '20140918 23:59:59'와 같지 않습니다. –

+0

tbh OP에서 날짜와 시간 또는 몇 번만 사용하고 있는지 확실하지 않습니다. 하지만 그 이외에 동의해야 할 것입니다. (그러나 당신의 대답에 나는 비슷한 것을하고 있습니까?> 20140918? – jbutler483

관련 문제