MySQL에서 분리된 날짜 필드를 하나의 DATE 값으로 합치기
데이터베이스 설계 과정에서 '일(Day)', '월(Month)', '연도(Year)'가 각각 별도의 컬럼으로 저장되어 있는 경우가 종종 있습니다. 이렇게 나누어진 값을 정렬, 비교, 범위 검색 등에 활용하려면 하나의 날짜(DATE) 형식으로 변환해야 하는데요. MySQL에서는 내장 함수인 STR_TO_DATE()와 CONCAT(), LPAD()를 조합하면 아주 간단하게 해결할 수 있습니다.
기본 문법
먼저 기본적인 쿼리 구조부터 살펴보겠습니다.
SELECT
STR_TO_DATE(CONCAT(연도컬럼명, '-', LPAD(월컬럼명, 2, '00'), '-', LPAD(일컬럼명, 2, '00')), '%Y-%m-%d') AS 별칭
FROM 테이블명;
여기서 LPAD(컬럼명, 2, '00')는 월이나 일이 한 자리 숫자(예: 5, 9)일 때 앞에 '0'을 채워 두 자리('05', '09')로 만들어 주는 역할을 합니다. 이 처리가 없으면 날짜 형식이 깨질 수 있으므로 반드시 포함하는 것이 좋습니다.
예제 테이블 생성하기
실습을 위해 일, 월, 연도를 저장하는 테이블을 만들어 보겠습니다.
mysql> CREATE TABLE DateCreateDemo
-> (
-> `Day` VARCHAR(2),
-> `Month` VARCHAR(2),
-> `Year` VARCHAR(4)
-> );
Query OK, 0 rows affected (1.68 sec)
샘플 데이터 입력
INSERT 명령으로 여러 건의 데이터를 넣어 보겠습니다. 의도적으로 한 자리 숫자(6, 8, 5, 9)도 함께 입력했습니다.
mysql> INSERT INTO DateCreateDemo VALUES('15','12','2018');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO DateCreateDemo VALUES('10','11','2016');
Query OK, 1 row affected (0.37 sec)
mysql> INSERT INTO DateCreateDemo VALUES('12','6','2017');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DateCreateDemo VALUES('9','8','2019');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO DateCreateDemo VALUES('10','5','2020');
Query OK, 1 row affected (0.09 sec)입력된 데이터 확인
SELECT 문으로 전체 레코드를 조회합니다.
mysql> SELECT * FROM DateCreateDemo;
실행 결과는 다음과 같습니다.
+------+-------+------+
| Day | Month | Year |
+------+-------+------+
| 15 | 12 | 2018 |
| 10 | 11 | 2016 |
| 12 | 6 | 2017 |
| 9 | 8 | 2019 |
| 10 | 5 | 2020 |
+------+-------+------+
5 rows in set (0.00 sec)
STR_TO_DATE()로 날짜 변환 실행
이제 세 개의 필드를 CONCAT으로 연결한 뒤 STR_TO_DATE() 함수로 실제 날짜로 변환해 보겠습니다.
mysql> SELECT
-> STR_TO_DATE(CONCAT(Year, '-', LPAD(Month, 2, '00'), '-', LPAD(Day, 2, '00')), '%Y-%m-%d') AS DateDemo
-> FROM DateCreateDemo;
결과는 다음과 같습니다.
+------------+
| DateDemo |
+------------+
| 2018-12-15 |
| 2016-11-10 |
| 2017-06-12 |
| 2019-08-09 |
| 2020-05-10 |
+------------+
5 rows in set (0.06 sec)
한 자리였던 월과 일(6 → 06, 9 → 09)이 LPAD 덕분에 올바르게 보정되어 표준 날짜 형식 'YYYY-MM-DD'로 깔끔하게 출력된 것을 확인할 수 있습니다.
추가 팁: MAKEDATE() 대안과 주의사항
참고로 MySQL에는 MAKEDATE(year, dayofyear)라는 함수도 있지만, 이 함수는 연도와 '연중 몇 번째 날'을 기준으로 하기 때문에 월·일이 따로 저장된 경우에는 위에서 소개한 STR_TO_DATE 방식이 더 적합합니다.
또한 원본 데이터에 유효하지 않은 날짜(예: 2월 30일)가 포함되어 있으면 STR_TO_DATE()는 NULL을 반환하므로, 변환 결과가 NULL로 나온다면 데이터 자체의 유효성을 먼저 점검해 보시기 바랍니다. 변환된 결과를 자주 사용한다면 뷰(VIEW)를 만들거나, 새로운 DATE 타입 컬럼을 추가해 값을 저장해 두는 것도 성능 면에서 좋은 선택입니다.