MySQL에서 날짜 데이터가 VARCHAR 타입으로 저장되어 있으면, 일반적인 DATETIME 비교 방식을 그대로 사용할 수 없습니다. 이럴 때는 STR_TO_DATE() 함수를 사용해 문자열을 날짜 형식으로 변환한 뒤 비교하면 됩니다. 아래 예제를 통해 단계별로 살펴보겠습니다.
1. 테스트 테이블 생성
먼저 배송 날짜(ShippingDate)를 VARCHAR 타입으로 저장하는 테이블을 생성합니다.
mysql> create table DemoTable1364
-> (
-> ShippingDate varchar(100)
-> );
Query OK, 0 rows affected (0.87 sec)2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 입력합니다. 날짜 형식은 '일-월-연도 시:분:초' 패턴입니다.
mysql> insert into DemoTable1364 values('01-09-2019 12:34:55');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1364 values('01-07-2018 17:10:00');
Query OK, 1 row affected (0.37 sec)
mysql> insert into DemoTable1364 values('24-09-2019 10:31:22');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable1364 values('20-09-2018 13:00:00');
Query OK, 1 row affected (0.13 sec)3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1364;
실행 결과는 다음과 같습니다.
+---------------------+ | ShippingDate | +---------------------+ | 01-09-2019 12:34:55 | | 01-07-2018 17:10:00 | | 24-09-2019 10:31:22 | | 20-09-2018 13:00:00 | +---------------------+ 4 rows in set (0.00 sec)
4. 특정 날짜 이후의 레코드 조회하기
VARCHAR 타입 컬럼에서 특정 날짜 이후의 레코드를 찾으려면, 양쪽 값을 모두 STR_TO_DATE()로 변환하여 비교해야 합니다. 문자열 그대로 비교하면 '01-09-2019'와 '24-09-2019'처럼 문자 순서 기준으로 정렬되어 잘못된 결과가 나올 수 있기 때문입니다.
mysql> select * from DemoTable1364
-> where str_to_date(ShippingDate,'%d-%m-%Y %H:%i:%s') > str_to_date('2019-09-21 10:31:20', '%Y-%m-%d %H:%i:%s');위 쿼리의 실행 결과는 다음과 같습니다.
+---------------------+ | ShippingDate | +---------------------+ | 24-09-2019 10:31:22 | +---------------------+ 1 row in set (0.00 sec)
2019년 9월 21일 10:31:20 이후인 레코드만 정확하게 필터링된 것을 확인할 수 있습니다.
주요 포맷 지정자 정리
STR_TO_DATE()에서 자주 사용되는 포맷 지정자는 다음과 같습니다.
%d— 일(day), 두 자리 숫자%m— 월(month), 두 자리 숫자%Y— 연도(year), 네 자리 숫자%H— 시(hour), 24시간제%i— 분(minute)%s— 초(second)
참고 사항
VARCHAR로 저장된 날짜를 함수로 변환해 비교하면 인덱스를 활용할 수 없어 대량 데이터에서 성능이 저하될 수 있습니다. 가능하다면 컬럼 타입을 DATETIME으로 변경하거나, 생성된 변환 값에 대한 함수 기반 인덱스를 고려하는 것이 좋습니다.