| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 티스토리챌린지
- 혼공챌린지
- 안드로이드
- groupby
- MySQL
- 혼공파
- 코테
- 기술면접
- 인프런
- CS
- 코틀린
- 자료구조
- Til
- Android
- 정처기
- 안드로이드스튜디오
- java
- select
- Kotlin
- 카카오코테
- 알고리즘
- 프로그래머스
- join
- 혼공단
- 오블완
- doitandroid
- SQL
- 스터디
- 정보처리기사
- 자바
- Today
- Total
Welcome! Everything is fine.
[MySQL] 날짜 범위 필터링하기 본문
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 모두 안정적으로 처리 가능, 인덱스 활용 가능
- 단점 : 문법이 장황해 보일 수 있음
'MySQL' 카테고리의 다른 글
| [MySQL] CRUD 기본 정리 및 예제 풀이 (3) | 2024.12.13 |
|---|---|
| [MySQL] Create, Read, Update, Delete 사용하기 (0) | 2024.10.23 |
| [MySQL] 기본키와 AUTO_INCREMENT 설정하기 (0) | 2024.10.10 |
| [MySQL] NULL과 NOT NULL, DEFAULT 설정하기 (0) | 2024.10.02 |
| [MySQL] Command Line에서 테이블 생성 / 확인 / 제거하기 (0) | 2024.09.18 |