MySQL에서 현재 날짜는 CURDATE() 함수로, 전날은 DATE_SUB() 함수에 INTERVAL 1 DAY를 조합하여 손쉽게 구할 수 있습니다. 이 두 함수를 활용하면 오늘과 어제의 데이터를 한 번의 쿼리로 조회할 수 있습니다.
기본 문법
먼저 현재 날짜에서 하루 전 날짜를 구하는 기본 쿼리는 다음과 같습니다.
SELECT DATE_SUB(CURDATE(), INTERVAL 1 DAY);
테이블에서 현재 날짜 또는 전날에 해당하는 레코드를 조회하려면 아래와 같이 WHERE 절에 OR 조건을 사용합니다.
SELECT * FROM yourTableName WHERE yourColumnName = CURDATE() OR yourColumnName = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
예제 테이블 생성하기
실제 동작을 확인하기 위해 예제 테이블을 만들어 보겠습니다. 아래 쿼리로 상품 정보를 저장할 테이블을 생성합니다.
mysql> CREATE TABLE ProductDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> ProductName varchar(20),
-> ProductOfferDate datetime,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.54 sec)샘플 데이터 삽입
INSERT 명령어를 사용해 상품명과 상품 등록일(오퍼 날짜) 데이터를 입력합니다.
mysql> INSERT INTO ProductDemo(ProductName, ProductOfferDate) VALUES('Product-11', '2017-05-21');
Query OK, 1 row affected (0.25 sec)
mysql> INSERT INTO ProductDemo(ProductName, ProductOfferDate) VALUES('Product-22', '2019-01-15');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO ProductDemo(ProductName, ProductOfferDate) VALUES('Product-21', '2019-01-14');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO ProductDemo(ProductName, ProductOfferDate) VALUES('Product-91', '2018-10-23');
Query OK, 1 row affected (0.26 sec)
mysql> INSERT INTO ProductDemo(ProductName, ProductOfferDate) VALUES('Product-133', '2019-01-24');
Query OK, 1 row affected (0.13 sec)SELECT 문으로 테이블의 모든 레코드를 확인합니다.
mysql> SELECT * FROM ProductDemo;
실행 결과는 다음과 같습니다.
+----+-------------+---------------------+ | Id | ProductName | ProductOfferDate | +----+-------------+---------------------+ | 1 | Product-11 | 2017-05-21 00:00:00 | | 2 | Product-22 | 2019-01-15 00:00:00 | | 3 | Product-21 | 2019-01-14 00:00:00 | | 4 | Product-91 | 2018-10-23 00:00:00 | | 5 | Product-133 | 2019-01-24 00:00:00 | +----+-------------+---------------------+ 5 rows in set (0.00 sec)
현재 날짜와 전날 데이터 조회 쿼리
이제 CURDATE()와 DATE_SUB()를 활용하여 현재 날짜 또는 전날에 해당하는 상품만 조회해 보겠습니다.
mysql> SELECT * FROM ProductDemo
-> WHERE ProductOfferDate = CURDATE()
-> OR ProductOfferDate = DATE_SUB(CURDATE(), INTERVAL 1 DAY);실행 결과, 현재 날짜(2019-01-15)와 전날(2019-01-14)에 해당하는 두 개의 레코드가 반환됩니다.
+----+-------------+---------------------+ | Id | ProductName | ProductOfferDate | +----+-------------+---------------------+ | 2 | Product-22 | 2019-01-15 00:00:00 | | 3 | Product-21 | 2019-01-14 00:00:00 | +----+-------------+---------------------+ 2 rows in set (0.00 sec)
추가 팁: DATETIME 컬럼 주의사항
컬럼 타입이 DATETIME인 경우 시간 정보까지 저장되므로, 위 예제처럼 날짜만 비교하려면 DATE() 함수를 사용하는 것이 안전합니다.
SELECT * FROM ProductDemo WHERE DATE(ProductOfferDate) = CURDATE() OR DATE(ProductOfferDate) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);
또한 대량의 데이터를 다룰 때는 인덱스 활용을 위해 BETWEEN 범위 조건을 사용하는 것이 성능 면에서 더 유리할 수 있습니다.