날짜 값이 VARCHAR 형식으로 저장되어 있어도 STR_TO_DATE() 함수를 사용하면 문자열을 날짜로 변환하여 원하는 레코드를 정확하게 조회할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 날짜를 VARCHAR 타입으로 저장하는 테이블을 생성합니다.
mysql> create table DemoTable
(
DueDate varchar(60)
);
Query OK, 0 rows affected (0.71 sec)2. 샘플 데이터 삽입하기
INSERT 문을 사용해 'DD-MON-YYYY' 형식의 날짜 문자열 몇 개를 입력합니다.
mysql> insert into DemoTable values('12-AUG-2016');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('14-AUG-2018');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('24-AUG-2012');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('14-AUG-2012');
Query OK, 1 row affected (0.19 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+-------------+ | DueDate | +-------------+ | 12-AUG-2016 | | 14-AUG-2018 | | 24-AUG-2012 | | 14-AUG-2012 | +-------------+ 4 rows in set (0.00 sec)
4. STR_TO_DATE()로 특정 날짜의 레코드 선택하기
VARCHAR 형식의 날짜에서 특정 레코드를 조회하려면 STR_TO_DATE() 함수를 사용해 문자열을 DATE 타입으로 변환한 뒤 비교하면 됩니다. 아래 쿼리는 '14-AUG-2012'에 해당하는 레코드만 가져옵니다.
mysql> select *from DemoTable where str_to_date(DueDate,'%d-%M-%Y')=str_to_date('14-AUG-2012','%d-%M-%Y');실행 결과는 다음과 같습니다.
+-------------+ | DueDate | +-------------+ | 14-AUG-2012 | +-------------+ 1 row in set (0.00 sec)
포맷 지정자 설명
%d: 일(01~31)을 나타냅니다.%M: 월 이름(예: August)을 나타냅니다.%Y: 4자리 연도를 나타냅니다.
이처럼 저장된 문자열의 형식에 맞는 포맷 지정자를 지정해 주기만 하면, VARCHAR로 저장된 날짜라도 DATE처럼 비교하고 조회할 수 있습니다. 다만 대량의 데이터를 자주 검색해야 한다면, 인덱스 활용과 성능을 고려해 처음부터 DATE 또는 DATETIME 타입으로 컬럼을 설계하는 것이 좋습니다.