MySQL에서 datetime 타입의 컬럼에 저장된 여러 날짜 값 중에서 오늘(현재 날짜)과 일치하는 레코드만 조회해야 하는 경우가 자주 있습니다. 이때는 DATE() 함수와 CURDATE() 함수를 함께 사용하면 간단하게 해결할 수 있습니다.
예제 시나리오
현재 날짜가 다음과 같다고 가정해 보겠습니다.
2019-07-22
1. 테이블 생성
먼저 배송 날짜를 저장할 테이블을 생성합니다.
mysql> create table DemoTable705 (ShippingDate datetime); Query OK, 0 rows affected (0.67 sec)
2. 샘플 데이터 삽입
INSERT 문을 사용해 몇 개의 레코드를 입력합니다.
mysql> insert into DemoTable705 values('2019-01-21 23:59:00');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable705 values('2019-07-22 00:00:30');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable705 values('2019-07-21 12:01:30');
Query OK, 1 row affected (0.44 sec)3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable705;
실행 결과는 다음과 같습니다.
+---------------------+ | ShippingDate | +---------------------+ | 2019-01-21 23:59:00 | | 2019-07-22 00:00:30 | | 2019-07-21 12:01:30 | +---------------------+ 3 rows in set (0.00 sec)
4. 현재 날짜와 일치하는 레코드 조회 쿼리
날짜 목록에서 현재 날짜에 해당하는 레코드를 가져오는 쿼리는 다음과 같습니다.
mysql> select *from DemoTable705 where date(ShippingDate)=CURDATE();
실행 결과:
+---------------------+ | ShippingDate | +---------------------+ | 2019-07-22 00:00:30 | +---------------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
DATE() 함수는 datetime 값에서 시간 정보를 제거하고 날짜 부분(YYYY-MM-DD)만 반환합니다. 반면 CURDATE() 함수는 현재 시스템 기준의 오늘 날짜를 반환합니다. 따라서 두 값을 비교하면 시간과 무관하게 날짜가 오늘인 모든 레코드를 정확하게 필터링할 수 있습니다.
참고: 만약
WHERE ShippingDate = NOW()처럼 비교하면 초 단위까지 일치해야 하므로 원하는 결과를 얻기 어렵습니다. 날짜 단위로 비교할 때는 반드시DATE()함수를 사용하는 것이 좋습니다.