날짜가 varchar 타입으로 저장되어 있어도 STR_TO_DATE() 함수를 활용하면 손쉽게 날짜 비교가 가능합니다. 이번 글에서는 입학일(AdmissionDate)이 현재 날짜보다 이전인 레코드만 조회하는 방법을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
(
AdmissionDate varchar(50)
);
Query OK, 0 rows affected (0.63 sec)참고: 현재 날짜가 2019년 9월 14일이라고 가정합니다.
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 여러 개의 날짜 데이터를 입력합니다.
mysql> insert into DemoTable values('15-Sep-2019');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('14-Sep-2019');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable values('13-Sep-2016');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('13-Sep-2019');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('13-Sep-2020');
Query OK, 1 row affected (0.10 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------+ | AdmissionDate | +---------------+ | 15-Sep-2019 | | 14-Sep-2019 | | 13-Sep-2016 | | 13-Sep-2019 | | 13-Sep-2020 | +---------------+ 5 rows in set (0.00 sec)
4. 현재 날짜보다 이전인 입학일 조회하기
문자열로 저장된 날짜는 그대로 비교할 수 없으므로, STR_TO_DATE() 함수로 DATE 타입으로 변환한 뒤 CURDATE()와 비교해야 합니다.
mysql> select *from DemoTable where str_to_date(AdmissionDate,'%d-%b-%Y') < CURDATE();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+---------------+ | AdmissionDate | +---------------+ | 13-Sep-2016 | | 13-Sep-2019 | +---------------+ 2 rows in set (0.00 sec)
결과 분석 및 핵심 포인트
현재 날짜가 2019년 9월 14일이므로, 그보다 이전인 '13-Sep-2016'과 '13-Sep-2019' 두 건만 조회되었습니다. 나머지 날짜는 오늘 또는 미래의 날짜이기 때문에 결과에서 제외됩니다.
여기서 사용된 형식 지정자는 다음과 같습니다.
- %d: 일(day), 두 자리 숫자 (예: 13)
- %b: 축약된 월 이름 (예: Sep)
- %Y: 네 자리 연도 (예: 2019)
저장된 날짜 형식에 맞게 형식 지정자를 조정하면 어떤 문자열 날짜든 정확하게 비교할 수 있습니다. 참고로, 실무에서는 날짜를 처음부터 DATE 타입 컬럼에 저장하는 것이 인덱스 활용과 성능 면에서 훨씬 유리하다는 점도 기억해 두시기 바랍니다.