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

MySQL에서 DATETIME 필드의 시간은 무시하고 날짜만 비교하는 방법

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';

이 방법은 인덱스를 그대로 활용할 수 있어 대용량 테이블에서 조회 속도를 크게 개선할 수 있습니다.