MySQL에서 현재 시각(NOW())을 기준으로 1일 전 이후의 레코드를 조회하려면 INTERVAL 키워드를 활용한 날짜 연산을 사용하면 됩니다. 가장 기본적인 문법은 다음과 같습니다.
기본 문법
SELECT * FROM yourTableName WHERE yourColumnName >= NOW() - INTERVAL 1 DAY;
이 문법은 yourColumnName의 값이 현재 시각에서 1일을 뺀 시점보다 크거나 같은 모든 행을 반환합니다. 실제 동작 방식을 이해하기 위해 예제 테이블을 만들어 단계별로 살펴보겠습니다.
예제 테이블 생성
먼저 DATETIME 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> CREATE TABLE GetRecordsFromNow
-> (
-> YourDateTime DATETIME
-> );
Query OK, 0 rows affected (1.76 sec)테스트 데이터 삽입
다음으로 DATE_ADD() 함수를 사용해 현재 시각을 기준으로 다양한 날짜의 데이터를 삽입합니다.
mysql> INSERT INTO GetRecordsFromNow VALUES(DATE_ADD(NOW(), INTERVAL 3 DAY)); Query OK, 1 row affected (0.28 sec) mysql> INSERT INTO GetRecordsFromNow VALUES(DATE_ADD(NOW(), INTERVAL -1 DAY)); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO GetRecordsFromNow VALUES(DATE_ADD(NOW(), INTERVAL -2 DAY)); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO GetRecordsFromNow VALUES(DATE_ADD(NOW(), INTERVAL -3 DAY)); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO GetRecordsFromNow VALUES(DATE_ADD(NOW(), INTERVAL -1 DAY)); Query OK, 1 row affected (0.08 sec)
전체 레코드 확인
SELECT 문으로 저장된 모든 데이터를 조회해 보겠습니다.
mysql> SELECT * FROM GetRecordsFromNow;
실행 결과는 다음과 같습니다.
+---------------------+ | YourDateTime | +---------------------+ | 2018-12-07 22:30:18 | | 2018-12-03 22:30:31 | | 2018-12-02 22:30:41 | | 2018-12-01 22:30:56 | | 2018-12-03 22:31:04 | +---------------------+ 5 rows in set (0.00 sec)
NOW() - 1일 조건으로 레코드 조회
이제 현재 시각에서 1일 전 이후의 레코드만 필터링하는 쿼리를 실행합니다.
mysql> SELECT * FROM GetRecordsFromNow
-> WHERE YourDateTime >= NOW() - INTERVAL 1 DAY;결과를 보면 미래 날짜인 2018-12-07 데이터 하나만 조건에 해당하여 반환됩니다.
+---------------------+ | YourDateTime | +---------------------+ | 2018-12-07 22:30:18 | +---------------------+ 1 row in set (0.04 sec)
참고: 대체 문법과 활용 팁
NOW() - INTERVAL 1 DAY와 동일한 결과를 내는 함수형 표현도 있습니다.
SELECT * FROM GetRecordsFromNow WHERE YourDateTime >= DATE_SUB(NOW(), INTERVAL 1 DAY);
또한 시간 단위를 자유롭게 변경할 수 있습니다. 예를 들어 최근 1시간 이내의 데이터가 필요하다면 INTERVAL 1 HOUR, 최근 7일이라면 INTERVAL 7 DAY로 바꿔 사용하면 됩니다.
성능 측면에서는 조회 대상 컬럼에 인덱스를 생성해 두는 것이 좋습니다. 인덱스가 있으면 범위 조건 검색 시 전체 테이블 스캔 없이 빠르게 결과를 가져올 수 있습니다.