MySQL에서 날짜 데이터를 다룰 때 입력값이 NULL인 경우에도 결과를 안전하게 처리해야 하는 상황이 자주 발생합니다. 이럴 때 IF() 함수를 활용하면 날짜 값이 NULL일 때 DATE_FORMAT()이 NULL을 반환하도록 손쉽게 구현할 수 있습니다.
기본 문법
SELECT IF(yourDateColumnName, DATE_FORMAT(yourDateColumnName, '%d/%m/%Y'), NULL) FROM yourTableName;
IF() 함수는 조건문처럼 작동합니다. 첫 번째 인자가 참(0이 아니고 NULL이 아닌 값)이면 두 번째 인자를 반환하고, 거짓이면 세 번째 인자를 반환합니다. 즉, 날짜 컬럼에 유효한 값이 들어 있으면 포맷팅된 날짜 문자열을 반환하고, NULL이면 NULL을 그대로 돌려줍니다.
예제 테이블 생성
문법을 이해하기 위해 먼저 예제용 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE returnNullWhenInputIsNullDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ShippingDate datetime
-> );
Query OK, 0 rows affected (1.21 sec)
샘플 데이터 삽입
INSERT 명령으로 배송 날짜 데이터를 여러 건 입력합니다. 비교를 위해 NULL 값도 일부러 포함시켰습니다.
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2019-01-21');
Query OK, 1 row affected (0.37 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2018-03-25');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES(NULL);
Query OK, 1 row affected (0.10 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2012-04-23');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2018-12-01');
Query OK, 1 row affected (0.23 sec)
mysql> INSERT INTO returnNullWhenInputIsNullDemo(ShippingDate) VALUES('2016-11-13');
Query OK, 1 row affected (0.13 sec)
전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> SELECT * FROM returnNullWhenInputIsNullDemo;
실행 결과는 다음과 같습니다.
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 1 | 2019-01-21 00:00:00 | | 2 | NULL | | 3 | 2018-03-25 00:00:00 | | 4 | NULL | | 5 | NULL | | 6 | 2012-04-23 00:00:00 | | 7 | 2018-12-01 00:00:00 | | 8 | 2016-11-13 00:00:00 | +----+---------------------+ 8 rows in set (0.00 sec)
입력값이 NULL일 때 NULL을 반환하는 쿼리
아래는 DATE_FORMAT() 처리 시 입력값이 NULL이면 NULL을 반환하도록 작성한 쿼리입니다.
mysql> SELECT IF(ShippingDate, DATE_FORMAT(ShippingDate, '%d/%m/%Y'), NULL) FROM returnNullWhenInputIsNullDemo;
실행 결과는 다음과 같습니다.
+-------------------------------------------------------------+ | IF(ShippingDate,date_format(ShippingDate, '%d/%m/%Y'),NULL) | +-------------------------------------------------------------+ | 21/01/2019 | | NULL | | 25/03/2018 | | NULL | | NULL | | 23/04/2012 | | 01/12/2018 | | 13/11/2016 | +-------------------------------------------------------------+ 8 rows in set (0.05 sec)
결과를 보면 날짜가 존재하는 행은 %d/%m/%Y(일/월/년) 형식으로 정상적으로 출력되고, NULL이었던 행은 그대로 NULL이 반환된 것을 확인할 수 있습니다.
추가 팁: 더 명확한 NULL 검사
참고로 MySQL의 DATE_FORMAT()은 원래 입력값이 NULL이면 NULL을 반환합니다. 다만 '0000-00-00'처럼 잘못 저장된 영(zero) 날짜가 데이터에 섞여 있을 때는 IF() 방식이 특히 유용합니다. 영 날짜는 숫자로 평가하면 0이 되어 거짓으로 처리되기 때문입니다.
또한 NULL 대신 특정 문자열(예: '-')을 표시하고 싶다면 아래처럼 응용할 수도 있습니다.
SELECT IF(ShippingDate IS NULL OR ShippingDate = 0, '-',
DATE_FORMAT(ShippingDate, '%d/%m/%Y'))
FROM returnNullWhenInputIsNullDemo;