MySQL에서 MM/YY 형식으로 저장된 문자열(예: 카드 유효기간 같은 월/연도 데이터)을 YYYY-MM-DD 형식의 날짜로 변환하려면 str_to_date() 함수를 사용하면 됩니다. 이 함수는 지정한 형식 문자열에 따라 텍스트를 DATE 값으로 해석해 줍니다.
1. 테이블 생성하기
먼저 실습에 사용할 테이블을 생성하고 날짜 데이터를 담을 컬럼을 준비합니다.
mysql> create table demo72
-> (
-> due_date varchar(40)
-> );
Query OK, 0 rows affected (2.96 sec)2. 샘플 데이터 삽입하기
insert 명령을 사용하여 MM/YY 형식의 레코드를 몇 개 입력합니다.
mysql> insert into demo72 values("11/15");
Query OK, 1 row affected (0.26 sec)
mysql> insert into demo72 values("02/20");
Query OK, 1 row affected (0.09 sec)
mysql> insert into demo72 values("07/95");
Query OK, 1 row affected (0.15 sec)3. 저장된 데이터 확인하기
select 문으로 테이블에 저장된 레코드를 조회해 보겠습니다.
mysql> select *from demo72;
실행 결과는 다음과 같습니다.
+----------+ | due_date | +----------+ | 11/15 | | 02/20 | | 07/95 | +----------+ 3 rows in set (0.00 sec)
4. MM/YY를 YYYY-MM-DD로 변환하는 쿼리
다음은 str_to_date()와 concat()을 조합하여 MM/YY 값을 YYYY-MM-DD 형식으로 변환하는 쿼리입니다.
mysql> select str_to_date(concat('10/', due_date), '%d/%m/%y') as original_date
-> from demo72;실행 결과는 다음과 같습니다.
+---------------+ | original_date | +---------------+ | 2015-11-10 | | 2020-02-10 | | 1995-07-10 | +---------------+ 3 rows in set (0.00 sec)
동작 원리 이해하기
쿼리가 어떻게 작동하는지 단계별로 살펴보겠습니다.
- concat('10/', due_date): 원본 값 앞에 임의의 일(day) 값인 '10/'을 붙여 '10/11/15'처럼 완전한 날짜 문자열을 만듭니다.
- '%d/%m/%y': 형식 지정자입니다. %d는 일, %m은 월, %y는 두 자리 연도를 의미합니다.
즉, '10/11/15'는 일=10, 월=11, 연도=15로 해석되어 최종적으로 2015-11-10이 출력됩니다.
두 자리 연도 처리 규칙
%y 형식 지정자는 두 자리 연도를 다음 규칙에 따라 해석합니다.
- 00~69: 2000년대로 변환 (예: '15' → 2015, '20' → 2020)
- 70~99: 1900년대로 변환 (예: '95' → 1995)
그래서 '07/95'가 1995-07-10으로 올바르게 변환된 것입니다.
참고: 일(day)을 붙이는 이유
만약 str_to_date(due_date, '%m/%y')처럼 일 없이 바로 변환하면 빠진 일 부분이 0으로 채워져 '2015-11-00' 같은 불완전한 날짜가 반환될 수 있습니다. 임의의 일 값을 앞에 붙여주면 항상 유효한 완전한 날짜를 얻을 수 있습니다.