MySQL에서 특정 테이블의 어제(전날) 데이터만 조회해야 하는 경우가 자주 있습니다. 예를 들어 일일 리포트를 생성하거나, 하루 동안 쌓인 로그를 확인할 때 유용하게 사용됩니다. 이 글에서는 NOW() 함수와 INTERVAL>을 활용해 전날의 모든 레코드를 손쉽게 가져오는 방법을 단계별로 알아보겠습니다.
기본 문법
전날의 레코드를 조회하려면 아래와 같은 문법을 사용합니다. 핵심은 컬럼에 DATE() 함수를 적용해 날짜 부분만 추출한 뒤, 현재 시각에서 하루를 뺀 날짜와 비교하는 것입니다.
select *from yourTableName where date(yourColumnName)= DATE(NOW() - INTERVAL 1 DAY);
예제 테이블 생성하기
문법을 실제로 이해하기 위해 간단한 테이블을 만들어 보겠습니다. 아래 쿼리는 ID와 도착 시간(ArrivalDateTime)을 저장하는 테이블을 생성합니다.
mysql> create table yesterDayRecordsDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ArrivalDateTime datetime
-> );
Query OK, 0 rows affected (0.44 sec)샘플 데이터 삽입하기
테스트를 위해 INSERT 명령으로 여러 개의 레코드를 삽입합니다. 의도적으로 서로 다른 날짜의 데이터를 넣어 필터링 결과가 잘 구분되도록 했습니다.
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2014-11-09 13:45:21');
Query OK, 1 row affected (0.11 sec)
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2017-10-19 11:41:31');
Query OK, 1 row affected (0.15 sec)
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2019-02-25 10:40:45');
Query OK, 1 row affected (0.14 sec)
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2019-02-26 12:06:07');
Query OK, 1 row affected (0.15 sec)
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2019-02-25 12:06:47');
Query OK, 1 row affected (0.19 sec)
mysql> insert into yesterDayRecordsDemo(ArrivalDateTime) values('2019-02-27 11:45:49');
Query OK, 1 row affected (0.12 sec)저장된 전체 레코드 확인하기
SELECT 문으로 테이블의 모든 레코드를 먼저 확인해 보겠습니다.
mysql> select *from yesterDayRecordsDemo;
실행 결과는 다음과 같습니다.
+----+---------------------+ | Id | ArrivalDateTime | +----+---------------------+ | 1 | 2014-11-09 13:45:21 | | 2 | 2017-10-19 11:41:31 | | 3 | 2019-02-25 10:40:45 | | 4 | 2019-02-26 12:06:07 | | 5 | 2019-02-25 12:06:47 | | 6 | 2019-02-27 11:45:49 | +----+---------------------+ 6 rows in set (0.00 sec)
어제(전날) 레코드만 조회하는 쿼리
이제 본론입니다. 아래 쿼리를 실행하면 어제 날짜에 해당하는 레코드만 정확히 필터링됩니다.
mysql> select *from yesterDayRecordsDemo where date(ArrivalDateTime)= DATE(NOW() - INTERVAL 1 DAY);
실행 결과는 다음과 같습니다.
+----+---------------------+ | Id | ArrivalDateTime | +----+---------------------+ | 4 | 2019-02-26 12:06:07 | +----+---------------------+ 1 row in set (0.08 sec)
동작 원리 정리
이 쿼리가 작동하는 원리는 다음과 같습니다.
NOW()는 현재 날짜와 시간을 반환하고, 여기서 - INTERVAL 1 DAY를 적용하면 정확히 하루 전 시점이 됩니다. 그런 다음 DATE() 함수로 시간 정보를 제거하고 날짜만 남긴 뒤, 테이블 컬럼의 날짜 값과 비교하여 일치하는 레코드만 반환합니다.
참고: 성능 최적화 팁
데이터 양이 많은 대형 테이블이라면 컬럼에 함수를 적용하는 위 방식은 인덱스를 제대로 활용하지 못할 수 있습니다. 이 경우 아래처럼 범위 조건으로 작성하면 인덱스 스캔이 가능해 성능이 크게 향상됩니다.
select *from yourTableName where yourColumnName >= DATE(NOW() - INTERVAL 1 DAY) and yourColumnName < DATE(NOW());
이처럼 MySQL에서는 NOW() - INTERVAL 1 DAY 조합만으로도 전날 데이터를 간단하고 정확하게 조회할 수 있습니다. 상황에 맞게 두 가지 방식을 선택해 활용해 보시기 바랍니다.