MySQL에서 DATETIME 타입의 컬럼에 저장된 데이터를 날짜 기준으로 검색하려면 DATE() 함수를 활용하면 됩니다. 이 함수는 DATETIME 값에서 시간 정보를 제거하고 날짜 부분만 반환하기 때문에, 특정 날짜에 해당하는 레코드를 간단하게 조회할 수 있습니다.
아래 예제를 통해 테이블 생성부터 날짜 조건 검색까지 전체 과정을 살펴보겠습니다.
1. 테이블 생성하기
먼저 승객 정보를 저장할 테이블을 생성합니다.
mysql> create table DemoTable732 (
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
PassengerId int,
PassengerName varchar(100),
PassengerAge int,
PassengerTravelDatetime datetime
);
Query OK, 0 rows affected (0.67 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) values(110,'Chris',25,'2019-07-23 12:45:56');
Query OK, 1 row affected (0.40 sec)
mysql> insert into DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) values(120,'Robert',24,'2019-07-21 11:05:00');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable732(PassengerId,PassengerName,PassengerAge,PassengerTravelDatetime) values(120,'Sam',26,'2019-07-21 11:05:00');
Query OK, 1 row affected (0.30 sec)
3. 전체 레코드 조회하기
SELECT 문으로 테이블에 저장된 모든 데이터를 확인해 보겠습니다.
mysql> select *from DemoTable732;
실행 결과는 다음과 같습니다.
+----+-------------+---------------+--------------+-------------------------+
| Id | PassengerId | PassengerName | PassengerAge | PassengerTravelDatetime |
+----+-------------+---------------+--------------+-------------------------+
| 1 | 110 | Chris | 25 | 2019-07-23 12:45:56 |
| 2 | 120 | Robert | 24 | 2019-07-21 11:05:00 |
| 3 | 120 | Sam | 26 | 2019-07-21 11:05:00 |
+----+-------------+---------------+--------------+-------------------------+
3 rows in set (0.00 sec)
4. 날짜 조건으로 레코드 개수 구하기
이제 DATE() 함수를 사용해 특정 날짜(2019-07-21)에 여행한 특정 승객(PassengerId = 120)의 레코드 개수를 조회해 보겠습니다.
mysql> select count(Id) from DemoTable732 where PassengerId=120 and
date(PassengerTravelDatetime)='2019-07-21';
실행 결과는 다음과 같습니다.
+-----------+
| count(Id) |
+-----------+
| 2 |
+-----------+
1 row in set (0.00 sec)
핵심 정리
위 쿼리에서 주목할 점은 date(PassengerTravelDatetime)='2019-07-21' 조건입니다. DATETIME 컬럼에는 '2019-07-21 11:05:00'처럼 시간 정보가 함께 저장되어 있지만, DATE() 함수가 날짜 부분만 추출해 주기 때문에 시간과 무관하게 해당 날짜의 레코드를 정확히 필터링할 수 있습니다.
참고로, 대량의 데이터를 다루는 경우에는 인덱스 활용을 위해 DATE() 함수 대신 범위 조건(>= '2019-07-21' AND < '2019-07-22')을 사용하는 것이 성능 면에서 더 유리할 수 있습니다.