MySQL에서 특정 테이블을 조회할 때 오늘 날짜에 해당하는 행은 제외하고 나머지 데이터만 가져와야 하는 경우가 있습니다. 예를 들어 마감일(due date)이 관리되는 작업 목록에서 오늘 처리할 항목을 빼고 과거 또는 미래의 항목만 확인하고 싶다면, CURDATE() 함수와 비교 연산자를 활용하면 간단하게 해결할 수 있습니다.
이 글에서는 실제 예제를 통해 오늘 날짜를 제외한 모든 행을 조회하는 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성하기
먼저 실습에 사용할 테이블을 생성합니다. 이름(Name)과 마감일(DueDate) 두 개의 컬럼을 가진 테이블입니다.
mysql> create table DemoTable
-> (
-> Name varchar(100),
-> DueDate datetime
-> );
Query OK, 0 rows affected (0.54 sec)2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 추가합니다. 여기서는 현재 날짜가 2019-07-03이라고 가정하겠습니다.
mysql> insert into DemoTable values('Chris','2019-06-24');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('Chris','2018-01-01');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('Robert','2019-07-03');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values('Carol','2019-08-03');
Query OK, 1 row affected (0.22 sec)3. 전체 데이터 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 먼저 확인해 보겠습니다.
mysql> select *from DemoTable;
출력 결과
+--------+---------------------+ | Name | DueDate | +--------+---------------------+ | Chris | 2019-06-24 00:00:00 | | Chris | 2018-01-01 00:00:00 | | Robert | 2019-07-03 00:00:00 | | Carol | 2019-08-03 00:00:00 | +--------+---------------------+ 4 rows in set (0.00 sec)
총 4개의 행이 있으며, 그중 Robert의 레코드(2019-07-03)만 오늘 날짜에 해당합니다.
4. 오늘 날짜를 제외한 행 조회하기
핵심은 DATE() 함수와 CURDATE() 함수의 조합입니다. DueDate 컬럼은 datetime 타입이므로 시간 정보까지 포함하고 있는데, DATE()로 날짜 부분만 추출한 뒤 CURDATE()(오늘 날짜)와 비교하면 정확하게 필터링할 수 있습니다.
mysql> select *from DemoTable where date(DueDate) !=curdate();
출력 결과
+-------+---------------------+ | Name | DueDate | +-------+---------------------+ | Chris | 2019-06-24 00:00:00 | | Chris | 2018-01-01 00:00:00 | | Carol | 2019-08-03 00:00:00 | +-------+---------------------+ 3 rows in set (0.00 sec)
실행 결과를 보면 오늘 날짜(2019-07-03)인 Robert의 레코드는 제외되고, 나머지 3개의 행만 정상적으로 조회된 것을 확인할 수 있습니다.
핵심 포인트 정리
CURDATE(): MySQL 서버의 현재 날짜(YYYY-MM-DD 형식)를 반환하는 함수입니다.DATE(DueDate): datetime 값에서 시간 정보를 제거하고 날짜 부분만 추출합니다.!=연산자: 두 값이 다를 때 참(true)을 반환하므로, 오늘이 아닌 날짜의 행만 선택됩니다.
datetime 컬럼을 그대로 CURDATE()와 비교하면 시간 정보 때문에 의도한 결과가 나오지 않을 수 있으므로, 반드시 DATE() 함수로 감싸서 비교하는 것이 안전합니다. 이 방법은 일정 관리, 알림 제외 처리 등 다양한 실무 상황에서 유용하게 활용할 수 있습니다.