MySQL에서 날짜가 bigint 타입의 Unix 타임스탬프 값으로 저장되어 있을 때, 오늘과 어제에 해당하는 최근 2일치 데이터만 조회해야 하는 경우가 자주 있습니다. 이 글에서는 CURDATE() 함수와 UNIX_TIMESTAMP() 함수를 조합하여 손쉽게 구현하는 방법을 예제와 함께 살펴보겠습니다.
1. 샘플 테이블 생성
먼저 배송 날짜(ShippingDate)를 bigint 타입으로 저장하는 테이블을 생성합니다.
mysql> create table DemoTable1495
-> (
-> ShippingDate bigint
-> );
Query OK, 0 rows affected (0.63 sec)
2. 테스트 데이터 삽입
INSERT 명령어를 사용하여 몇 개의 타임스탬프 레코드를 삽입합니다.
mysql> insert into DemoTable1495 values(1570127400);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1495 values(1570213800);
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1495 values(1570645800);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1495 values(1570300200);
Query OK, 1 row affected (0.15 sec)
3. 전체 데이터 확인
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1495;
실행 결과는 다음과 같습니다.
+--------------+
| ShippingDate |
+--------------+
| 1570127400 |
| 1570213800 |
| 1570645800 |
| 1570300200 |
+--------------+
4 rows in set (0.00 sec)
4. 현재 날짜 확인
기준이 되는 현재 날짜를 먼저 확인합니다.
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2019-10-06 |
+------------+
1 row in set (0.00 sec)
5. 오늘·어제 2일치 데이터 조회 쿼리
핵심은 UNIX_TIMESTAMP(CURDATE() - INTERVAL 1 DAY)로 어제 날짜의 시작 시점(자정)을 구하고, UNIX_TIMESTAMP(CURDATE() + INTERVAL 1 DAY)로 내일 자정 직전까지의 범위를 지정하는 것입니다. 이렇게 하면 어제 00:00:00부터 오늘 23:59:59까지의 모든 데이터를 정확하게 필터링할 수 있습니다.
mysql> select * from DemoTable1495
-> where ShippingDate >= unix_timestamp(curdate() - interval 1 day)
-> and
-> ShippingDate < unix_timestamp(curdate() + interval 1 day);
실행 결과는 다음과 같습니다.
+--------------+
| ShippingDate |
+--------------+
| 1570213800 |
| 1570300200 |
+--------------+
2 rows in set (0.00 sec)
정리
타임스탬프 컬럼이 bigint로 저장되어 있더라도 CURDATE()에 INTERVAL 연산을 적용한 뒤 UNIX_TIMESTAMP()로 변환하면, 별도의 데이터 타입 변경 없이도 특정 기간(예: 오늘과 어제 2일)의 데이터를 간단하고 효율적으로 조회할 수 있습니다. 이 방식은 범위 조건(>=, <)을 사용하기 때문에 인덱스 활용에도 유리하여 대용량 테이블에서도 좋은 성능을 기대할 수 있습니다.