Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 VARCHAR 날짜 컬럼으로 특정 날짜 이후 레코드 조회하기 (STR_TO_DATE 활용법)

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으로 변경하거나, 생성된 변환 값에 대한 함수 기반 인덱스를 고려하는 것이 좋습니다.