MySQL에서 날짜가 VARCHAR 타입으로 저장되어 있을 때, 이를 현재 날짜(CURDATE())와 비교하려면 STR_TO_DATE() 함수를 사용하면 됩니다. 문자열로 저장된 날짜를 실제 DATE 타입으로 변환한 후 비교 연산을 수행하는 방식입니다.
기본 문법
select * from yourTableName where str_to_date(yourColumnName,'yourFormatSpecifier') > curdate();
예제 테이블 생성
먼저 예제에 사용할 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1397
-> (
-> AdmissionDate varchar(40)
-> );
Query OK, 0 rows affected (0.97 sec)다음으로 INSERT 문을 사용해 몇 개의 레코드를 삽입합니다.
mysql> insert into DemoTable1397 values('01/04/2019');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1397 values('27/09/2019');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1397 values('29/09/2018');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable1397 values('29/09/2019');
Query OK, 1 row affected (0.08 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1397;
실행 결과는 다음과 같습니다.
+---------------+ | AdmissionDate | +---------------+ | 01/04/2019 | | 27/09/2019 | | 29/09/2018 | | 29/09/2019 | +---------------+ 4 rows in set (0.00 sec)
현재 날짜 확인
비교 기준이 될 현재 날짜를 먼저 확인해 보겠습니다.
mysql> select curdate(); +------------+ | curdate() | +------------+ | 2019-09-27 | +------------+ 1 row in set (0.00 sec)
VARCHAR 날짜와 현재 날짜 비교 쿼리
이제 STR_TO_DATE() 함수를 사용하여 문자열 형태의 날짜를 DATE 타입으로 변환하고, 현재 날짜보다 큰(미래의) 레코드만 조회하는 쿼리를 작성합니다. 여기서는 날짜가 '일/월/년' 형식으로 저장되어 있으므로 포맷 지정자로 '%d/%m/%Y'를 사용합니다.
mysql> select * from DemoTable1397
-> where str_to_date(AdmissionDate,'%d/%m/%Y') > curdate();실행 결과는 다음과 같습니다.
+---------------+ | AdmissionDate | +---------------+ | 29/09/2019 | +---------------+ 1 row in set (0.07 sec)
결과 분석
현재 날짜가 2019-09-27이므로, 그 이후의 날짜인 '29/09/2019' 레코드 하나만 조회된 것을 확인할 수 있습니다. '29/09/2018'은 과거 날짜이고, '01/04/2019'와 '27/09/2019'는 현재 날짜와 같거나 이전이므로 결과에서 제외됩니다.
주요 포맷 지정자 참고
%d: 일 (01~31)%m: 월 (01~12)%Y: 4자리 연도 (예: 2019)%y: 2자리 연도 (예: 19)
팁: 날짜 데이터는 가능하면 DATE 또는 DATETIME 타입으로 저장하는 것이 좋습니다. VARCHAR로 저장하면 인덱스 활용이 어렵고, 매번 STR_TO_DATE()로 변환해야 하므로 대량 데이터 조회 시 성능 저하가 발생할 수 있습니다.