MySQL에서 "01 August 2019"와 같은 형식으로 저장된 날짜는 문자열이기 때문에 일반적인 ORDER BY만으로는 시간순 정렬이 되지 않습니다. 이럴 때 STR_TO_DATE() 함수를 함께 사용하면 문자열을 실제 날짜 값으로 변환해 올바르게 정렬할 수 있습니다.
예제 테이블 생성하기
먼저 데모에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1435
-> (
-> DueDate varchar(60)
-> );
Query OK, 0 rows affected (1.08 sec)
레코드 삽입하기
INSERT 문을 이용해 여러 형태의 날짜 문자열을 입력합니다.
mysql> insert into DemoTable1435 values('01 August 2019');
Query OK, 1 row affected (0.34 sec)
mysql> insert into DemoTable1435 values('01 Feb 2018');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1435 values('31 Jan 2017');
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable1435 values('01 March 2019');
Query OK, 1 row affected (0.11 sec)저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1435;
실행 결과는 다음과 같습니다.
+----------------+
| DueDate |
+----------------+
| 01 August 2019 |
| 01 Feb 2018 |
| 31 Jan 2017 |
| 01 March 2019 |
+----------------+
4 rows in set (0.00 sec)
STR_TO_DATE()로 날짜 정렬하기
"01 August 2019" 형식의 날짜를 정렬하려면 아래 쿼리처럼 STR_TO_DATE() 함수에 형식 지정자 '%d %M %Y'를 지정합니다.
mysql> select * from DemoTable1435
-> order by str_to_date(DueDate,'%d %M %Y');
실행 결과는 다음과 같습니다.
+----------------+
| DueDate |
+----------------+
| 31 Jan 2017 |
| 01 Feb 2018 |
| 01 March 2019 |
| 01 August 2019 |
+----------------+
4 rows in set (0.04 sec)
형식 지정자의 의미
- %d : 일(01~31)
- %M : 월 이름(January ~ December)
- %Y : 4자리 연도(예: 2019)
이처럼 STR_TO_DATE()를 활용하면 텍스트 형식으로 저장된 날짜도 실제 날짜 값으로 변환되어 연도 → 월 → 일 순서대로 정확하게 정렬됩니다. 날짜가 VARCHAR 컬럼에 저장된 기존 테이블을 다룰 때 특히 유용한 방법입니다.