MySQL에서 여러 날짜 조건을 조합해 데이터를 조회해야 하는 경우가 자주 있습니다. 예를 들어 '입사일은 특정 날짜보다 이전이고, 퇴사일은 특정 날짜보다 이후이거나 아직 값이 없어(NULL) 재직 중인 레코드'를 찾는 상황을 생각해 볼 수 있습니다. 이 글에서는 WHERE 절과 AND, OR 연산자를 활용해 이러한 조건부 날짜 조회를 처리하는 방법을 단계별로 살펴봅니다.
기본 문법
두 개의 날짜 열에 조건을 걸 때는 아래와 같은 형식의 쿼리를 사용합니다.
select *from yourTableName
where
yourColumnName1 < yourValue1 AND
(yourColumnName2 > yourValue2 OR yourColumnName2 is null);
핵심은 괄호입니다. AND 연산자가 OR 연산자보다 우선순위가 높기 때문에, OR 조건을 괄호로 묶어 주지 않으면 의도와 다른 결과가 반환될 수 있습니다.
예제 테이블 생성
먼저 실습에 사용할 테이블을 만들어 보겠습니다.
mysql> create table demo35
-> (
-> id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> joining_date date,
-> relieving_date date
-> );
Query OK, 0 rows affected (3.88 sec)
demo35 테이블은 id(기본 키), joining_date(입사일), relieving_date(퇴사일) 세 개의 열로 구성되어 있습니다.
샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into demo35(joining_date,relieving_date) values('2020-01-10','2020-07-11');
Query OK, 1 row affected (0.15 sec)
mysql> insert into demo35(joining_date,relieving_date) values('2020-05-07','2020-12-08');
Query OK, 1 row affected (0.17 sec)
mysql> insert into demo35(joining_date,relieving_date) values('2020-04-11','2020-09-18');
Query OK, 1 row affected (0.14 sec)
mysql> insert into demo35(joining_date,relieving_date) values('2020-03-12','2020-10-01');
Query OK, 1 row affected (0.13 sec)저장된 데이터 확인
SELECT 문으로 테이블에 저장된 전체 레코드를 조회합니다.
mysql> select *from demo35;
실행 결과는 다음과 같습니다.
+----+--------------+----------------+
| id | joining_date | relieving_date |
+----+--------------+----------------+
| 1 | 2020-01-10 | 2020-07-11 |
| 2 | 2020-05-07 | 2020-12-08 |
| 3 | 2020-04-11 | 2020-09-18 |
| 4 | 2020-03-12 | 2020-10-01 |
+----+--------------+----------------+
4 rows in set (0.00 sec)
조건부 날짜 조회 쿼리 실행
이제 입사일이 '2020-05-11'보다 이전이면서, 퇴사일이 '2020-08-10'보다 이후이거나 NULL인 레코드를 조회하는 쿼리를 실행해 보겠습니다.
mysql> select *from demo35
-> where
-> joining_date < '2020-05-11' AND
-> (relieving_date > '2020-08-10' OR relieving_date is null);
실행 결과는 다음과 같습니다.
+----+--------------+----------------+
| id | joining_date | relieving_date |
+----+--------------+----------------+
| 2 | 2020-05-07 | 2020-12-08 |
| 3 | 2020-04-11 | 2020-09-18 |
| 4 | 2020-03-12 | 2020-10-01 |
+----+--------------+----------------+
3 rows in set (0.00 sec)
결과 분석
결과에서 id가 1인 레코드는 제외되었습니다. 이 레코드의 퇴사일이 '2020-07-11'로 조건값 '2020-08-10'보다 이전이기 때문입니다. 반면 id 2, 3, 4번 레코드는 입사일이 '2020-05-11' 이전이고 퇴사일이 '2020-08-10' 이후라는 두 조건을 모두 충족하므로 정상적으로 조회되었습니다.
만약 퇴사일이 NULL인 재직 중인 직원까지 함께 조회하고 싶다면, 위 쿼리처럼 OR relieving_date is null 조건을 추가하면 됩니다. 이렇게 하면 퇴사일이 아직 입력되지 않은 레코드도 누락 없이 결과에 포함시킬 수 있습니다.