MySQL에서 날짜 데이터가 VARCHAR 타입의 컬럼에 문자열로 저장되어 있는 경우, 단순히 ORDER BY를 사용하면 사전순으로 정렬되어 원하는 결과를 얻을 수 없습니다. 이럴 때는 STR_TO_DATE() 함수를 활용하여 문자열을 날짜로 변환한 뒤 정렬하면 됩니다.
기본 문법
SELECT * FROM yourTableName
ORDER BY STR_TO_DATE(yourColumnName, '%M %Y') DESC;
위 문법에서 %M %Y는 'March 2019'와 같은 형식의 날짜 문자열을 해석하기 위한 포맷 지정자입니다. DESC를 사용하면 최신 날짜부터 내림차순으로 정렬됩니다.
예제 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable678(DueDate varchar(200));
Query OK, 0 rows affected (0.62 sec)
데이터 삽입
INSERT 명령을 사용해 날짜 형식의 문자열 데이터를 몇 개 삽입합니다.
mysql> insert into DemoTable678 values('March 2019');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable678 values('November 2018');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable678 values('January 2019');
Query OK, 1 row affected (0.18 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable678;
실행 결과는 다음과 같습니다.
+---------------+
| DueDate |
+---------------+
| March 2019 |
| November 2018 |
| January 2019 |
+---------------+
3 rows in set (0.00 sec)
VARCHAR 날짜 기준 정렬 쿼리
이제 STR_TO_DATE() 함수를 사용하여 VARCHAR 타입으로 저장된 날짜를 기준으로 정렬하는 쿼리를 실행해 보겠습니다.
mysql> select *from DemoTable678 ORDER BY STR_TO_DATE(DueDate, '%M %Y') DESC;
실행 결과는 다음과 같습니다.
+---------------+
| DueDate |
+---------------+
| March 2019 |
| January 2019 |
| November 2018 |
+---------------+
3 rows in set (0.00 sec)
결과 분석
위 결과를 보면 날짜가 최신순(내림차순)으로 올바르게 정렬된 것을 확인할 수 있습니다. 즉, 2019년 3월 → 2019년 1월 → 2018년 11월 순서로 출력됩니다. 만약 오름차순으로 정렬하고 싶다면 DESC 대신 ASC를 사용하면 됩니다.
참고: 주요 날짜 포맷 지정자
%M— 월 이름 (예: January, February)%m— 두 자리 숫자 월 (01~12)%Y— 네 자리 연도 (예: 2019)%d— 두 자리 일 (01~31)
날짜 문자열의 실제 형식에 맞게 포맷 지정자를 조합하여 사용하면 다양한 형태의 VARCHAR 날짜 데이터도 정확하게 정렬할 수 있습니다.