Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 오늘 날짜와 일치하는 레코드를 조회하는 방법

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와 같은 범위 조건 방식도 고려해 보시기 바랍니다.