MySQL에서 DATETIME 필드에 저장된 시간 정보는 무시하고 날짜만 비교해야 하는 경우가 자주 있습니다. 예를 들어 로그인 기록에서 특정 날짜의 데이터만 조회하고 싶다면, 시·분·초까지 일치할 필요는 없겠죠.
이럴 때 DATE() 함수를 사용하면 간단하게 해결할 수 있습니다. 기본 문법은 다음과 같습니다.
SELECT * FROM 테이블명 WHERE DATE(컬럼명) = '비교할날짜';
예제 테이블 생성하기
개념을 이해하기 위해 먼저 샘플 테이블을 만들어 보겠습니다. 아래 쿼리로 사용자 이름과 로그인 시간을 저장하는 테이블을 생성합니다.
mysql> CREATE TABLE ComparingDate
-> (
-> Name varchar(100),
-> Login datetime
-> );
Query OK, 0 rows affected (0.50 sec)샘플 데이터 삽입
이제 INSERT 명령으로 몇 개의 레코드를 추가합니다. 각 레코드에는 서로 다른 날짜와 시간이 포함되어 있습니다.
mysql> INSERT INTO ComparingDate VALUES('John','2014-04-06 22:50:45');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO ComparingDate VALUES('Bob','2018-12-15 15:07:46');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO ComparingDate VALUES('Carol','2016-03-10 21:50:40');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO ComparingDate VALUES('David','1995-08-08 23:40:47');
Query OK, 1 row affected (0.14 sec)전체 데이터 조회
SELECT 문으로 테이블의 모든 레코드를 확인해 보겠습니다.
mysql> SELECT * FROM ComparingDate;
실행 결과는 다음과 같습니다.
+-------+---------------------+ | Name | Login | +-------+---------------------+ | John | 2014-04-06 22:50:45 | | Bob | 2018-12-15 15:07:46 | | Carol | 2016-03-10 21:50:40 | | David | 1995-08-08 23:40:47 | +-------+---------------------+ 4 rows in set (0.00 sec)
시간을 무시하고 날짜만 비교하는 쿼리
이제 핵심입니다. DATE() 함수를 적용하면 DATETIME 값에서 날짜 부분만 추출되므로, 시간과 관계없이 특정 날짜의 레코드를 조회할 수 있습니다.
mysql> SELECT * FROM ComparingDate WHERE DATE(Login) = '2016-03-10';
결과를 확인해 보면, 로그인 시각이 밤 9시 50분이지만 날짜가 2016년 3월 10일인 Carol의 레코드만 정확히 반환된 것을 볼 수 있습니다.
+-------+---------------------+ | Name | Login | +-------+---------------------+ | Carol | 2016-03-10 21:50:40 | +-------+---------------------+ 1 row in set (0.00 sec)
참고: 성능 최적화 팁
컬럼에 함수를 적용하면(WHERE DATE(Login) = ...) 해당 컬럼에 설정된 인덱스를 활용하지 못할 수 있습니다. 데이터 양이 많다면 아래처럼 범위 조건을 사용하는 것이 성능 면에서 더 유리합니다.
SELECT * FROM ComparingDate WHERE Login >= '2016-03-10 00:00:00' AND Login < '2016-03-11 00:00:00';
이 방법은 인덱스를 그대로 활용할 수 있어 대용량 테이블에서 조회 속도를 크게 개선할 수 있습니다.