이벤트·배너·팝업 기간 검색 SQL 쿼리 작성법 (PHP 예제 포함)

이벤트·배너·팝업 관리 기능을 만들다 보면 반드시 부딪히는 문제가 있다.
바로 “기간이 겹치는 데이터를 어떻게 검색할 것인가” 이다.

예를 들어 이벤트 기간이 2025-11-03 ~ 2025-11-08 인데,
관리자가 2025-11-01 ~ 2025-11-05 사이의 이벤트를 검색하면 이 데이터는 조회되어야 한다.
이런 경우 단순히 BETWEEN만 사용하는 방식으로는 원하는 결과가 나오지 않는 경우가 많다.

실제로 나도 관리자 페이지를 개발하면서
이벤트, 팝업, 예약 기능의 기간 검색이 꼬여서 데이터가 누락되는 문제를 여러 번 겪었다.
특히 “진행 중 이벤트만 조회되지 않는다”거나 “검색 조건에 따라 일부 데이터가 빠진다”는 문제가 자주 발생했다.

이번 글에서는 실무에서 많이 사용하는
기간 교차 검색 SQL 패턴을 정리해보자.

원인은 무엇인가

기간 검색이 어려운 이유는
“특정 날짜가 포함되는지”가 아니라
“두 기간이 서로 겹치는지”를 판단해야 하기 때문이다.

예를 들어 아래와 같은 데이터가 있다고 해보자.

이벤트명시작일종료일
블랙프라이데이2025-11-032025-11-08

그리고 관리자가 아래 조건으로 검색한다.

2025-11-01 ~ 2025-11-05

이 경우 이벤트 시작일은 검색 시작일보다 늦지만,
검색 종료일과는 겹친다.

즉, 단순히 BETWEEN으로 비교하면 안 되고
“기간 교차 여부”를 판단해야 한다.

왜 문제가 되는가

기간 검색 로직이 잘못되면 다음과 같은 문제가 발생한다.

  • 진행 중 이벤트가 조회되지 않음
  • 특정 기간 데이터 누락
  • 종료되지 않은 이벤트 검색 실패
  • 팝업 노출 기간 오류
  • 예약 가능 일정 누락

특히 관리자 페이지에서는
“분명 등록했는데 검색이 안 된다”는 문의가 자주 발생한다.

실제로 이벤트 관리 기능을 개발할 때
기간 검색 조건 때문에 운영팀에서 오류 제보가 들어온 적이 있었는데,
원인은 단순한 날짜 비교 로직이었다.

그 이후부터는 항상 “기간 교차” 기준으로 검색하도록 수정해서 사용하고 있다.

해결 방법

검색 시작일과 종료일이 모두 있는 경우

가장 많이 사용하는 방식이다.

SELECT *
FROM `event`
WHERE `start_date` <= '2025-11-05'
	AND `end_date` >= '2025-11-01';

이 조건의 핵심은 아래와 같다.

이벤트 시작일 <= 검색 종료일
AND
이벤트 종료일 >= 검색 시작일

즉, 두 기간이 하루라도 겹치면 조회된다.

검색 시작일만 있는 경우

SELECT *
FROM `event`
WHERE `end_date` >= '2025-11-01';

검색 시작일 이후에도 진행 중인 이벤트를 조회한다.

예를 들어 “오늘 이후 진행 예정 이벤트”를 찾을 때 유용하다.

종료일이 NULL인 상시 이벤트 처리

운영하다 보면 종료일이 없는
“상시 진행 이벤트”가 존재하는 경우도 많다.

이때는 NULL 조건을 반드시 포함해야 한다.

SELECT *
FROM `event`
WHERE `start_date` <= '2025-11-05'
	AND (
		`end_date` IS NULL
		OR `end_date` >= '2025-11-01'
	);

이 조건이 없으면 상시 이벤트가 검색되지 않을 수 있다.

실제 사례

예전에 팝업 관리 기능을 개발할 때 이런 문제가 있었다.

  • 팝업 기간: 2025-11-01 ~ 2025-11-30
  • 관리자 검색 기간: 2025-11-15 ~ 2025-11-20

그런데 검색 결과가 나오지 않았다.

원인을 확인해보니 아래처럼 작성되어 있었다.

WHERE `start_date` BETWEEN '2025-11-15' AND '2025-11-20'

이 방식은 시작일만 비교하기 때문에
11월 1일에 시작된 팝업은 검색되지 않는다.

이후 기간 교차 방식으로 수정했다.

WHERE `start_date` <= '2025-11-20'
	AND `end_date` >= '2025-11-15'

수정 후에는 정상적으로 모든 데이터가 조회되었다.

PHP에서 동적으로 조건 조합하기

실무에서는 검색 조건이 매번 달라지기 때문에
PHP에서 WHERE 조건을 동적으로 조합하는 방식이 많이 사용된다.

$where = [];

if (!empty($search_start) && !empty($search_end)) {
$where[] = "(`start_date` <= '{$search_end}' AND `end_date` >= '{$search_start}')";
} else if (!empty($search_start)) {
$where[] = "(`end_date` >= '{$search_start}')";
} else if (!empty($search_end)) {
$where[] = "(`start_date` <= '{$search_end}')";
}

$sql = "SELECT * FROM `event`";

if ($where) {
$sql .= " WHERE " . implode(" AND ", $where);
}

이 방식의 장점은 다음과 같다.

  • 조건 추가가 쉬움
  • 유지보수 편리
  • 불필요한 WHERE 제거 가능
  • 관리자 검색 기능 확장 용이

정리

이벤트·배너·팝업 관리 기능에서 기간 검색은
단순 날짜 비교가 아니라 “기간 교차 여부”를 판단해야 한다.

핵심 패턴은 아래 한 줄이다.

`start_date` <= 검색종료일
AND
`end_date` >= 검색시작일

이 로직만 정확히 이해해도
다음과 같은 기능에 모두 응용할 수 있다.

  • 이벤트 관리
  • 팝업 노출
  • 예약 시스템
  • 일정 관리
  • 프로모션 기능
  • 쿠폰 사용 기간

실무에서는 생각보다 자주 사용하는 패턴이므로
한 번 제대로 정리해두면 계속 재사용하게 된다.