Welcome! Everything is fine.

[MySQL] 날짜 범위 필터링하기 본문

MySQL

[MySQL] 날짜 범위 필터링하기

개발곰발 2025. 8. 28.
728x90

SQL로 데이터를 조회하다 보면 특정 기간의 데이터를 가져와야 할 때가 많다.
예를 들어, "2022년 10월에 작성된 글만 조회" 같은 조건이 필요하다.

사실 나는 SQL 문제를 풀 때 LIKE 문법이 익숙해서 자주 사용하는데, 날짜 범위 필터링을 하는 방법은 더 많다.

따라서 날짜 범위 필터링 시 자주 쓰이는 SQL 문법들을 정리해봤다.

LIKE

WHERE CREATED_DATE LIKE '2022-10%'

 

LIKE는 문자열 비교 연산자로, '2022-10%' 라는 패턴을 주면, '2022-10'으로 시작하는 문자열을 찾아준다.

  • 장점 : 간단하고 직관적인 문법
  • 단점 : DATE 타입보다는 VARCHAR 처럼 문자열로 저장된 날짜에 적

BETWEEN

WHERE CREATED_DATE BETWEEN '2022-10-01' AND '2022-10-31'

 

BETWEEN A AND B는 A 이상 B 이하 범위를 의미한다. 즉, '2022-10-01' <= CREATED_DATE <= '2022-10-31' 조건과 동일하다. 단, 컬럼이 DATETIME 타입이라면 마지막 날짜를 '2022-10-31 23:59:59'까지 지정해야 안전하다. 이 문제를 해결하기 위해서는 아래 DATE() 함수를 참고하자.

  • 장점 : 뛰어난 가독성
  • 단점 : CREATED_DATE가 DATETIME일 경우 문제 발생 ('2022-10-31'은 2022-10-31 00:00:00까지만 포함)

DATE()

WHERE DATE(CREATED_DATE) BETWEEN '2022-10-01' AND '2022-10-31'

 

DATE() 함수는 DATETIME에서 날짜 부분(YYYY-MM-DD)만 잘라내는 함수로, 위에서 언급한 문제점을 해결할 수 있다. 그러나 날짜만 추출해서 비교해야 하기 때문에 인덱스에 있는 값 그대로는 비교할 수 없다. 따라서 DB는 모든 행을 하나씩 읽어서 DATE() 함수를 계산해야 조건을 판별할 수 있다. 이 과정 때문에 인덱스를 그대로 활용할 수 없고, 결국 Full Table Scan(테이블 전체 스캔)이 일어나 성능이 떨어질 수 있다.

  • 장점 : DATETIME 컬럼에서도 정확히 원하는 날짜만 비교 가능
  • 단점 : 컬럼에 함수를 적용(DATE(CREATED_DATE))하면 DB가 인덱스를 활용하지 못함. 즉, 데이터가 많아질수록 성능이 급격히 느려질 수 있음

YEAR() + MONTH()

WHERE YEAR(CREATED_DATE) = 2022 AND MONTH(CREATED_DATE) = 10

 

  • YEAR() 함수: 날짜에서 연도를 추출
  • MONTH() 함수: 날짜에서 월을 추출

각 함수로 날짜에서 연도, 월을 추출해 2022년 10월 데이터만 걸러낼 수 있다.

그러나 역시 DATE()를 사용할 때와 같은 단점이 있다.

  • 장점 : 읽고 이해하기 쉬움
  • 단점 : DATE()와 마찬가지로 인덱스를 사용하지 못하고, 성능이 떨어질 수 있음

 

>= AND <

WHERE CREATED_DATE >= '2022-10-01'
  AND CREATED_DATE < '2022-11-01'

 

 

시작일 이상(>= '2022-10-01') 다음 달 1일 미만(< '2022-11-01') 의 데이터를 구하는 쿼리다.10월 1일부터 10월 31일까지 모든 데이터가 포함된다. 가장 권장되는 방식이다.

  • 장점 : DATE / DATETIME 모두 안정적으로 처리 가능, 인덱스 활용 가능
  • 단점 : 문법이 장황해 보일 수 있음