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

MySQL에서 어제(전날)의 모든 레코드 조회하는 방법

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 조합만으로도 전날 데이터를 간단하고 정확하게 조회할 수 있습니다. 상황에 맞게 두 가지 방식을 선택해 활용해 보시기 바랍니다.