MySQL에서 날짜가 문자열(varchar) 형태로 저장되어 있을 때는 단순 문자열 비교만으로는 올바른 결과를 얻기 어렵습니다. 이럴 때 STR_TO_DATE() 함수를 사용하면 문자열을 날짜 형식으로 변환한 뒤 정확하게 비교할 수 있습니다.
STR_TO_DATE()란?
STR_TO_DATE()는 지정한 형식에 맞춰 문자열을 DATE 타입으로 변환해 주는 MySQL 내장 함수입니다. 날짜 데이터를 텍스트로 저장한 컬럼을 다룰 때 특히 유용합니다.
예제 테이블 생성
먼저 실습용 테이블을 생성하겠습니다. 날짜를 varchar 타입으로 저장하는 것이 핵심 포인트입니다.
mysql> create table DemoTable712 (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ArrivalDate varchar(100)
);
Query OK, 0 rows affected (0.65 sec)샘플 데이터 삽입
'일.월.연도' 형식(예: 10.01.2019)의 날짜 문자열을 여러 건 삽입합니다.
mysql> insert into DemoTable712(ArrivalDate) values('10.01.2019');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable712(ArrivalDate) values('11.12.2018');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable712(ArrivalDate) values('01.11.2017');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable712(ArrivalDate) values('20.06.2016');
Query OK, 1 row affected (0.23 sec)저장된 데이터 확인
SELECT 문으로 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable712;
실행 결과는 다음과 같습니다.
+----+-------------+ | Id | ArrivalDate | +----+-------------+ | 1 | 10.01.2019 | | 2 | 11.12.2018 | | 3 | 01.11.2017 | | 4 | 20.06.2016 | +----+-------------+ 4 rows in set (0.00 sec)
날짜 문자열 비교 쿼리
이제 STR_TO_DATE()를 사용해 특정 날짜와 일치하는 레코드를 조회해 보겠습니다. 저장된 형식이 '일.월.연도'이므로 %d.%m.%Y 포맷을 지정합니다.
mysql> select *from DemoTable712 where str_to_date(ArrivalDate,'%d.%m.%Y')='2017-11-01';
실행 결과:
+----+-------------+ | Id | ArrivalDate | +----+-------------+ | 3 | 01.11.2017 | +----+-------------+ 1 row in set (0.00 sec)
포맷 지정자 정리
쿼리에 사용된 주요 포맷 지정자는 다음과 같습니다.
%d— 일(day), 두 자리 숫자 (01~31)%m— 월(month), 두 자리 숫자 (01~12)%Y— 연도(year), 네 자리 숫자 (예: 2019)
주의 사항
날짜 문자열을 직접 비교하면 '01.11.2017'과 같은 값은 문자 기준으로 해석되어 의도하지 않은 결과가 나올 수 있습니다. 반드시 STR_TO_DATE()로 변환한 후 비교해야 정확한 날짜 연산이 가능합니다. 또한 대량의 데이터를 조회할 경우 변환 함수 사용으로 인덱스를 활용하지 못할 수 있으므로, 성능이 중요하다면 처음부터 DATE 타입 컬럼을 사용하는 것이 좋습니다.