Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 조건에 따라 특정 날짜 이전·이후 데이터를 조회하는 방법

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 조건을 추가하면 됩니다. 이렇게 하면 퇴사일이 아직 입력되지 않은 레코드도 누락 없이 결과에 포함시킬 수 있습니다.