MySQL에서 STR_TO_DATE() 함수의 결과에 AS로 별칭(alias)을 지정한 뒤 WHERE 절에서 해당 별칭을 사용하면 "Unknown column(열을 찾을 수 없음)" 오류가 발생합니다. 이는 MySQL이 WHERE 절을 처리할 때 아직 SELECT 목록의 별칭이 정의되지 않기 때문입니다.
이 문제는 HAVING 절을 사용하면 간단히 해결할 수 있습니다. HAVING 절은 SELECT 이후에 평가되기 때문에 별칭을 참조할 수 있습니다. 실제 예제를 통해 살펴보겠습니다.
1. 테이블 생성
먼저 날짜가 문자열(varchar) 형태로 저장된 테이블을 만들어 보겠습니다.
mysql> create table DemoTable -> ( -> AdmissionDate varchar(100) -> ); Query OK, 0 rows affected (0.55 sec)
2. 데이터 삽입
INSERT 명령어를 사용해 '일/월/년' 형식의 날짜 문자열을 여러 개 입력합니다.
mysql> insert into DemoTable values('10/12/2017');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('01/11/2018');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('31/01/2019');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('09/06/2019');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('19/04/2019');
Query OK, 1 row affected (0.23 sec)3. 전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> select *from DemoTable;
출력 결과
+---------------+ | AdmissionDate | +---------------+ | 10/12/2017 | | 01/11/2018 | | 31/01/2019 | | 09/06/2019 | | 19/04/2019 | +---------------+ 5 rows in set (0.00 sec)
4. STR_TO_DATE와 HAVING 절 활용
아래 쿼리는 STR_TO_DATE() 함수로 문자열 날짜를 DATE 타입으로 변환하고, 그 결과에 newDate라는 별칭을 부여한 뒤 HAVING 절에서 필터링합니다.
mysql> select STR_TO_DATE(AdmissionDate, '%d/%m/%Y') as newDate from DemoTable -> having newDate >= '2019-01-01';
출력 결과
+------------+ | newDate | +------------+ | 2019-01-31 | | 2019-06-09 | | 2019-04-19 | +------------+ 3 rows in set (0.00 sec)
위 결과를 보면 2019년 1월 1일 이후의 날짜 3건만 정상적으로 조회된 것을 확인할 수 있습니다.
추가 팁: WHERE 절에서 직접 함수 사용하기
HAVING 대신 WHERE 절을 꼭 사용해야 한다면, 별칭 대신 함수 호출 자체를 조건에 작성하면 됩니다.
mysql> select STR_TO_DATE(AdmissionDate, '%d/%m/%Y') as newDate from DemoTable -> where STR_TO_DATE(AdmissionDate, '%d/%m/%Y') >= '2019-01-01';
다만 이 방식은 같은 함수를 두 번 호출하므로 성능 면에서는 HAVING 절이나 서브쿼리를 활용하는 것이 더 유리할 수 있습니다. 데이터 양이 많다면 애초에 날짜를 DATE 타입 컬럼으로 저장하는 것이 가장 좋은 설계입니다.