MySQL에서 오늘 날짜에 해당하는 데이터만 조회하고 싶다면 내장 함수 CURDATE()를 활용하면 됩니다. CURDATE()는 현재 시간은 제외하고 오늘 날짜만 반환하는 함수입니다. 이 함수와 DATE() 함수를 조합하면 특정 날짜 컬럼의 값이 오늘과 일치하는 레코드만 손쉽게 추출할 수 있습니다.
기본 쿼리 문법
오늘 날짜와 동일한 레코드를 조회하는 기본 문법은 다음과 같습니다.
SELECT yourColumnName1, yourColumnName2, ......, yourColumnNameN, DATE_FORMAT(yourDateColumnName, '%Y-%m-%d') FROM yourTableName WHERE DATE(yourDateColumnName) = CURDATE();
여기서 핵심은 DATETIME 타입 컬럼에 DATE() 함수를 적용하여 시간 정보를 제거하고 날짜 부분만 비교한다는 점입니다. 만약 DATE() 없이 비교하면 '2018-12-06 19:13:30' 같은 값은 자정 이후의 시간이 포함되어 조건에 맞지 않게 됩니다.
예제 테이블 생성
개념을 이해하기 위해 실습용 테이블을 먼저 생성해 보겠습니다. 아래 테이블에는 날짜를 저장하기 위한 datetime 타입 컬럼이 포함되어 있습니다.
mysql> create table GmailSignIn -> ( -> UserId int, -> UserName varchar(200), -> DateOfSignIn datetime -> ); Query OK, 0 rows affected (1.56 sec)
샘플 데이터 삽입
이제 INSERT 명령으로 몇 개의 레코드를 삽입해 보겠습니다. 현재 날짜는 2018-12-06이며, 어제와 내일 날짜의 데이터도 함께 넣어 비교 대상을 명확히 했습니다.
mysql> insert into GmailSignIn values(222111,'John',now()); Query OK, 1 row affected (0.15 sec) mysql> insert into GmailSignIn values(333222,'Johnson',curdate()); Query OK, 1 row affected (0.18 sec) mysql> insert into GmailSignIn values(444333,'Carol',date_add(curdate(),interval 1 day)); Query OK, 1 row affected (0.13 sec) mysql> insert into GmailSignIn values(555444,'David',date_add(curdate(),interval -1 day)); Query OK, 1 row affected (0.83 sec)
SELECT 문으로 테이블의 전체 레코드를 확인합니다.
mysql> select *from GmailSignIn;
실행 결과는 다음과 같습니다.
+--------+----------+---------------------+ | UserId | UserName | DateOfSignIn | +--------+----------+---------------------+ | 222111 | John | 2018-12-06 19:13:30 | | 333222 | Johnson | 2018-12-06 00:00:00 | | 444333 | Carol | 2018-12-07 00:00:00 | | 555444 | David | 2018-12-05 00:00:00 | +--------+----------+---------------------+ 4 rows in set (0.00 sec)
오늘 날짜와 일치하는 레코드 조회
이제 날짜가 오늘과 같은 레코드만 선택하여 결과를 반환하는 쿼리를 실행해 보겠습니다.
mysql> select UserId,UserName,DateOfSignIn,DATE_FORMAT(DateOfSignIn, '%Y-%m-%d') from GmailSignIn -> where date(DateOfSignIn) = curdate();
실행 결과는 다음과 같습니다.
+--------+----------+---------------------+---------------------------------------+ | UserId | UserName | DateOfSignIn | DATE_FORMAT(DateOfSignIn, '%Y-%m-%d') | +--------+----------+---------------------+---------------------------------------+ | 222111 | John | 2018-12-06 19:13:30 | 2018-12-06 | | 333222 | Johnson | 2018-12-06 00:00:00 | 2018-12-06 | +--------+----------+---------------------+---------------------------------------+ 2 rows in set (0.00 sec)
결과를 보면 전체 4개 레코드 중에서 DateOfSignIn의 날짜 부분이 오늘(2018-12-06)과 일치하는 John과 Johnson의 레코드 2개만 정확하게 반환된 것을 확인할 수 있습니다. Carol(내일)과 David(어제)의 데이터는 조건에서 제외되었습니다.
정리 및 참고 사항
- CURDATE(): 현재 날짜만 반환 (예: 2018-12-06)
- NOW(): 현재 날짜와 시간을 모두 반환 (예: 2018-12-06 19:13:30)
- DATE(): datetime 값에서 날짜 부분만 추출
- DATE_FORMAT(): 날짜를 원하는 형식의 문자열로 변환하여 출력
DATETIME 컬럼에서 날짜만 비교할 때는 반드시 DATE() 함수로 감싸서 시간 성분을 제거한 뒤 CURDATE()와 비교해야 의도한 결과를 얻을 수 있습니다. 다만 인덱스가 설정된 대용량 테이블에서는 DATE() 함수 사용 시 인덱스를 활용하지 못할 수 있으므로, 성능이 중요한 환경에서는 DateOfSignIn >= CURDATE() AND DateOfSignIn < CURDATE() + INTERVAL 1 DAY와 같은 범위 조건 방식도 고려해 보시기 바랍니다.