VARCHAR로 저장된 날짜에 MySQL SELECT 수행하기
MySQL에서 날짜 데이터가 VARCHAR 타입으로 저장되어 있는 경우, 일반적인 날짜 비교 연산을 바로 수행할 수 없습니다. 이럴 때 STR_TO_DATE() 함수를 사용하면 문자열 형태의 날짜를 실제 DATE 값으로 변환하여 조건 비교를 할 수 있습니다. 아래 예제를 통해 전체 과정을 살펴보겠습니다.
1. 테이블 생성
먼저 데모용 테이블을 생성합니다.
mysql> create table DemoTable
(
DueDate varchar(100)
);
Query OK, 0 rows affected (0.50 sec)2. 레코드 삽입
insert 명령을 사용하여 날짜 문자열을 테이블에 삽입합니다.
mysql> insert into DemoTable values('21/10/2018');
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable values('18/08/2019');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('01/12/2012');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('31/01/2016');
Query OK, 1 row affected (0.19 sec)3. 전체 레코드 조회
select 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
다음과 같은 결과가 출력됩니다.
+------------+ | DueDate | +------------+ | 21/10/2018 | | 18/08/2019 | | 01/12/2012 | | 31/01/2016 | +------------+ 4 rows in set (0.00 sec)
4. VARCHAR 날짜에 조건부 SELECT 적용
다음은 VARCHAR로 저장된 날짜 컬럼에 SELECT 조건을 적용하는 쿼리입니다. STR_TO_DATE() 함수와 포맷 지정자 '%d/%m/%Y'(일/월/년 순서)를 사용해 문자열을 날짜로 변환한 뒤, 2010-01-31 이후의 모든 날짜 레코드를 조회합니다.
mysql> select *from DemoTable where str_to_date(DueDate,'%d/%m/%Y') > '2010-01-31';
실행 결과는 다음과 같습니다.
+------------+ | DueDate | +------------+ | 21/10/2018 | | 18/08/2019 | | 01/12/2012 | | 31/01/2016 | +------------+ 4 rows in set (0.00 sec)
주요 포맷 지정자 정리
- %d — 일(01~31)
- %m — 월(01~12)
- %Y — 4자리 연도
저장된 날짜 문자열의 실제 형식에 맞게 포맷 지정자를 조정해야 올바른 변환 결과를 얻을 수 있습니다. 참고로 WHERE 절에서 컬럼에 함수를 적용하면 인덱스를 활용하기 어려워 성능이 저하될 수 있으므로, 대량의 데이터를 다루는 경우에는 처음부터 DATE 타입으로 컬럼을 설계하는 것이 좋습니다.