반응형

데이터베이스에서 기간과 기간이 겹치는 데이터를 찾을 때, 복잡한 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_종료일 >= 검색_시작일

이 간단한 패턴으로 모든 경우를 빠짐없이 처리할 수 있고, 가독성과 성능 면에서도 우수하다

반응형

+ Recent posts