MySQL에서 DATE 문자열과 DATETIME 필드 비교하기
MySQL에서는 DATE() 함수를 활용하면 DATE 문자열과 DATETIME 필드에 저장된 값을 손쉽게 비교할 수 있습니다. DATETIME 타입은 날짜와 시간 정보를 함께 담고 있기 때문에, 날짜만 추출해서 비교하려면 DATE() 함수가 필요합니다.
기본 문법
select * from yourTableName where DATE(yourColumnName) = 'anyDateString';
위 문법을 이해하기 위해 실제 테이블을 생성하고 DATETIME 값을 몇 개 삽입한 뒤 비교 쿼리를 실행해 보겠습니다.
1. 테이블 생성
먼저 DATETIME 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> create table DateTimeDemo -> ( -> ArrivalTime datetime -> ); Query OK, 0 rows affected (0.61 sec)
2. 데이터 삽입
INSERT 명령어를 사용해 현재 시간(now())과 특정 연도를 더하거나 뺀 날짜 데이터를 여러 건 입력합니다.
mysql> insert into DateTimeDemo values(now()); Query OK, 1 row affected (0.11 sec) mysql> insert into DateTimeDemo values(date_add(now(),interval 2 year)); Query OK, 1 row affected (0.47 sec) mysql> insert into DateTimeDemo values(date_add(now(),interval 1 year)); Query OK, 1 row affected (0.19 sec) mysql> insert into DateTimeDemo values(date_add(now(),interval 4 year)); Query OK, 1 row affected (0.13 sec) mysql> insert into DateTimeDemo values(date_add(now(),interval -2 year)); Query OK, 1 row affected (0.17 sec) mysql> insert into DateTimeDemo values(date_add(now(),interval -1 year)); Query OK, 1 row affected (0.17 sec)
3. 전체 데이터 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.
mysql> select *from DateTimeDemo;
실행 결과는 다음과 같습니다.
+---------------------+ | ArrivalTime | +---------------------+ | 2018-12-06 10:12:45 | | 2020-12-06 10:13:10 | | 2019-12-06 10:13:21 | | 2022-12-06 10:13:27 | | 2016-12-06 10:13:42 | | 2017-12-06 10:13:50 | +---------------------+ 6 rows in set (0.00 sec)
4. DATE() 함수로 문자열 비교
이제 앞서 설명한 문법을 적용하여 DATETIME 필드와 날짜 문자열을 비교해 보겠습니다. DATE() 함수가 DATETIME 값에서 날짜 부분만 추출하기 때문에 '2022-12-06'이라는 문자열과 정확히 일치하는 행만 반환됩니다.
mysql> select *from DateTimeDemo where date(ArrivalTime) = '2022-12-06';
실행 결과는 다음과 같습니다.
+---------------------+ | ArrivalTime | +---------------------+ | 2022-12-06 10:13:27 | +---------------------+ 1 row in set (0.14 sec)
참고 사항
DATE() 함수를 WHERE 절에서 사용하면 인덱스를 제대로 활용하지 못해 대용량 테이블에서 성능이 저하될 수 있습니다. 이 경우 다음과 같이 범위 조건으로 작성하는 것이 더 효율적입니다.
select * from DateTimeDemo where ArrivalTime >= '2022-12-06 00:00:00' and ArrivalTime < '2022-12-07 00:00:00';
이 방식은 ArrivalTime 컬럼에 설정된 인덱스를 그대로 활용할 수 있어 조회 속도 면에서 유리합니다.