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

MySQL에서 DATE 및 NULL 레코드가 포함된 테이블의 날짜 필터링 방법

MySQL에서 DATETIME 컬럼에 NULL 값이 섞여 있을 때는 단순한 비교 연산만으로는 원하는 결과를 얻기 어렵습니다. 이 글에서는 DATE 값과 NULL 레코드가 공존하는 테이블에서 날짜 조건으로 데이터를 올바르게 필터링하는 방법을 예제와 함께 살펴보겠습니다.

1. 테이블 생성하기

먼저 DATETIME 타입의 두 컬럼을 가진 테이블을 생성합니다.

mysql> create table DemoTable
(
    FirstDate datetime,
    SecondDate datetime
);
Query OK, 0 rows affected (0.57 sec)

2. 샘플 데이터 삽입하기

insert 명령을 사용해 테이블에 여러 레코드를 삽입합니다. 이때 일부 레코드에는 의도적으로 NULL 값을 포함시켜 실무에서 자주 발생하는 상황을 재현합니다.

mysql> insert into DemoTable values('2019-01-21','2018-01-21');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('2019-10-04','2019-08-14');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('2019-05-01','2019-09-11');
Query OK, 1 row affected (0.65 sec)
mysql> insert into DemoTable values(NULL,NULL);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('2019-03-01',NULL);
Query OK, 1 row affected (0.13 sec)

3. 전체 데이터 확인하기

select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

+---------------------+---------------------+
| FirstDate           | SecondDate          |
+---------------------+---------------------+
| 2019-01-21 00:00:00 | 2018-01-21 00:00:00 |
| 2019-10-04 00:00:00 | 2019-08-14 00:00:00 |
| 2019-05-01 00:00:00 | 2019-09-11 00:00:00 |
| NULL                | NULL                |
| 2019-03-01 00:00:00 | NULL                |
+---------------------+---------------------+
5 rows in set (0.00 sec)

총 5개의 레코드 중 두 번째 컬럼(SecondDate)에 NULL이 포함된 행이 있는 것을 확인할 수 있습니다.

4. 날짜 필터링 쿼리 작성하기

DATETIME 값과 NULL 레코드가 함께 있는 테이블에서 원하는 기간의 데이터만 추출하려면 다음과 같은 쿼리를 사용합니다.

mysql> select *from DemoTable
where FirstDate <= curdate() and (SecondDate >=curdate() or SecondDate IS NULL);

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

+---------------------+---------------------+
| FirstDate           | SecondDate          |
+---------------------+---------------------+
| 2019-05-01 00:00:00 | 2019-09-11 00:00:00 |
| 2019-03-01 00:00:00 | NULL                |
+---------------------+---------------------+
2 rows in set (0.00 sec)

쿼리 동작 원리 이해하기

이 쿼리는 두 가지 조건을 조합하여 동작합니다.

첫 번째 조건: FirstDate가 오늘 날짜(curdate())보다 작거나 같아야 합니다.
두 번째 조건: SecondDate가 오늘 날짜보다 크거나 같거나, NULL이어야 합니다.

여기서 핵심은 SQL에서 NULL을 비교 연산자(>=, <= 등)와 비교하면 TRUE나 FALSE가 아닌 UNKNOWN이 반환된다는 점입니다. 따라서 SecondDate >= curdate() 조건만 사용하면 SecondDate가 NULL인 행은 자동으로 결과에서 제외됩니다.

이러한 누락을 방지하려면 위 예제처럼 OR SecondDate IS NULL 조건을 반드시 함께 작성해야 합니다. 덕분에 마지막 레코드처럼 SecondDate가 NULL인 행도 정상적으로 조회 결과에 포함된 것을 확인할 수 있습니다.