데이터공부기록/SQL

[SQL] 맨날 헷갈리는 BETWEEN 포함 범위 총정리

팔랑팔랑마음 2023. 7. 7. 11:54

SQL에서 BETWEEN을 사용할 떄마다 맨날 헷갈리는 것이 있다.

 

 'BETWEEN 10 AND 20'이라고 하면

10 이상 20 이하?

10 이상 20 미만?

 

어쩜 할 때마다 또 잊어먹고 또 헷갈리는지..

그래서 이번 기회에 확실히 정리하려고 한다!

 

(아래의 예시는 Bigquery에서 thelook_ecommerce 데이터 샘플을 사용했습니다.)

 

 

BETWEEN의 범위

'BETWEEN (조건1) AND (조건2)'는

'(조건1) 이상 (조건2) 이하'를 의미한다.

 

 

숫자형

요청사항: 나이가 10세 이상 20세 이하인 유저의 first name과 나이를 추출해주세요.

SELECT first_name, age 
FROM `thelook_ecommerce.users`
WHERE age BETWEEN 10 and 20
ORDER BY age DESC

쿼리 결과

나이가 10세 이상 20세 이하인 유저를 추출한다.

age를 기준으로 내림차순 했을 때 20세도 출력되는 것을 볼 수 있다.

 

 

날짜형

요청사항: 주문날짜가 2020년 1월인 주문의 order id와 주문날짜를 출력해주세요.

SELECT order_id, created_at
FROM `thelook_ecommerce.orders`
WHERE created_at BETWEEN '2020-01-01' and '2020-01-31'
ORDER BY created_at DESC

쿼리 결과

2020년 1월만 추출하려고 위와 같이 쿼리를 작성하면

보시다시피 2020년 1월 30일까지만 출력된다.

 

왜냐하면 위 쿼리가 의미하는 것은

'2020-01-01 00:00:00 부터 2020-01-31 00:00:00 까지'를 의미하기 때문이다.

1월 31일까지 포함하고 싶다면 '2020-01-31' 대신 '2020-02-01'로 수정해야 한다. 

참고) Bigquery에서 created_at 컬럼의 데이터 타입은 TIMESTAMP이다.

 

이렇게 날짜형에서 BETWEEN을 사용할 땐,

날짜만 적었더라도 항상 시간까지 염두에 두고 쿼리를 작성해야한다.

 

+)

날짜 조건을 거는 또 다른 방법으로는

날짜를 문자형으로 변경해서 추출하는 방법이 있다.

SELECT order_id, created_at
FROM `thelook_ecommerce.orders`
WHERE string(created_at) LIKE '2020-01-%'
ORDER BY created_at DESC

 

 

 

between은 숫자형보다 날짜형이 진짜 헷갈리는데 이번부터는 절대 까먹지 말자~!