MySQL에서 특정 테이블의 데이터를 조회할 때, 오늘 날짜에 해당하는 레코드는 제외하고 나머지 레코드만 모두 가져와야 하는 경우가 있습니다. 이 글에서는 CURDATE() 함수와 DATE() 함수를 조합하여 이를 간단하게 처리하는 방법을 예제와 함께 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable
-> (
-> Name varchar(100),
-> DueDate datetime
-> );
Query OK, 0 rows affected (0.54 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 삽입합니다. 여기서는 현재 날짜가 '2019-07-05'라고 가정합니다.
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-05');
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-05 00:00:00 |
| Carol | 2019-08-03 00:00:00 |
+--------+---------------------+
4 rows in set (0.00 sec)
4. 오늘 날짜 레코드를 제외한 조회 쿼리
핵심은 WHERE 절에서 DATETIME 타입의 컬럼에 DATE() 함수를 적용해 날짜 부분만 추출한 뒤, CURDATE()(현재 날짜)와 비교하는 것입니다.
mysql> select *from DemoTable where date(DueDate) != curdate();
DATE(DueDate) != CURDATE() 조건은 마감일(DueDate)의 날짜 부분이 오늘과 다른 경우에만 참이 되므로, 결과적으로 오늘 날짜('2019-07-05')의 Robert 레코드는 제외되고 나머지 레코드만 출력됩니다.
출력 결과
+-------+---------------------+
| 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)
마무리 정리
DATETIME컬럼에는 시간 정보까지 포함되어 있으므로, 단순히!= NOW()로 비교하면 의도와 다른 결과가 나올 수 있습니다.DATE()함수로 날짜 부분만 잘라내고CURDATE()와 비교하면 시간과 무관하게 정확하게 필터링할 수 있습니다.- 반대로 오늘 날짜의 레코드만 조회하려면
=연산자로 조건을 변경하면 됩니다.
이처럼 DATE()와 CURDATE() 함수의 조합은 날짜 기반 필터링 작업에서 매우 유용하게 활용됩니다.