반응형
데이터베이스에서 기간과 기간이 겹치는 데이터를 찾을 때, 복잡한 OR 조건 대신 두 개의 간단한 비교 조건만으로 모든 경우를 처리할 수 있다.
WHERE DB_시작일 <= 검색_종료일 AND DB_종료일 >= 검색_시작일
1. 들어가며
커머스 서비스를 개발하다 보면 이벤트, 프로모션, 예약 등 시작일과 종료일을 가진 데이터를 검색해야 하는 경우가 정말 많다.
단순히 특정 날짜가 포함된 데이터를 찾는 건 간단한데, 사용자가 입력한 기간과 DB에 저장된 기간이 겹치는 모든 경우를 찾는 건 생각보다 복잡하다. 이 글에서는 단 두 줄로 모든 경우를 처리하는 효율적인 쿼리 작성법을 알아보려고 한다.
2. 문제 상황
사용자가 2023년 9월 7일부터 10월 7일까지의 이벤트를 검색할 때, 많은 개발자들이 이렇게 작성한다.
SELECT *
FROM MY_TABLE
WHERE
EVENT_ST_DATE BETWEEN '2023-09-07' AND '2023-10-07'
OR EVENT_ED_DATE BETWEEN '2023-09-07' AND '2023-10-07'
OR '2023-09-07' BETWEEN EVENT_ST_DATE AND EVENT_ED_DATE
OR '2023-10-07' BETWEEN EVENT_ST_DATE AND EVENT_ED_DATE
- 4개의 OR 조건으로 가독성이 떨어진다
- 조건을 누락하거나 잘못 작성하기 쉽다
- 인덱스 활용이 비효율적이다
3. 해결 방법
SELECT *
FROM MY_TABLE
WHERE
EVENT_ST_DATE <= '2023-10-07' -- DB 시작이 검색 종료 이전
AND EVENT_ED_DATE >= '2023-09-07' -- DB 종료가 검색 시작 이후
이렇게 사용하자.
WHERE
{DB_시작일} <= {검색_종료일}
AND {DB_종료일} >= {검색_시작일}
장점
- 단 두 줄로 모든 경우를 처리 할수 있다
- 가독성이 훨씬 좋다
- AND 조건으로 인덱스 활용이 효율적이다
- 실수할 여지가 적다
- 모든 데이터베이스에서 동일하게 작동한다
4. 정리
데이터베이스에서 기간과 기간이 겹치는 데이터를 검색할 때는 겹치지 않는 경우의 반대를 생각하는 게 핵심이다.
복잡한 OR 조건 대신, 다음 두 가지 조건만 기억하자.
WHERE DB_시작일 <= 검색_종료일 AND DB_종료일 >= 검색_시작일
이 간단한 패턴으로 모든 경우를 빠짐없이 처리할 수 있고, 가독성과 성능 면에서도 우수하다
반응형