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

MySQL DATETIME 필드에서 DATE 조건으로 오늘 날짜의 레코드 조회하기

MySQL에서 DATETIME 타입으로 저장된 데이터 중에서 오늘 날짜에 해당하는 레코드만 조회하고 싶은 경우가 자주 있습니다. 이 글에서는 DATE() 함수와 CURDATE(), DATE_SUB() 함수를 활용하여 DATETIME 필드에서 오늘의 레코드를 추출하는 방법을 예제와 함께 살펴보겠습니다.

1. DATETIME 타입 컬럼을 가진 테이블 생성

먼저 DATETIME 타입의 컬럼을 하나 포함하는 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
(
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ShippingDate datetime
);
Query OK, 0 rows affected (0.54 sec)

위 테이블은 자동 증가하는 기본키 Id와 배송 일시를 저장하는 ShippingDate(datetime 타입) 컬럼으로 구성되어 있습니다.

2. 테스트용 레코드 삽입

INSERT 명령을 사용하여 테이블에 몇 개의 레코드를 삽입합니다.

mysql> insert into DemoTable(ShippingDate) values('2019-03-01 05:45:32');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable(ShippingDate) values('2019-04-13 11:34:56');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(ShippingDate) values('2019-03-15 04:45:23');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable(ShippingDate) values('2019-04-11 12:10:02');
Query OK, 1 row affected (0.17 sec)

3. 전체 레코드 확인

SELECT 문을 사용하여 테이블에 저장된 모든 레코드를 조회해 보겠습니다.

mysql> select *from DemoTable;

실행 결과는 다음과 같습니다.

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 1  | 2019-03-01 05:45:32 |
| 2  | 2019-04-13 11:34:56 |
| 3  | 2019-03-15 04:45:23 |
| 4  | 2019-04-11 12:10:02 |
+----+---------------------+
4 rows in set (0.00 sec)

4. 오늘 날짜의 레코드 조회하기

DATETIME 필드에서 오늘 날짜에 해당하는 레코드를 가져오려면 시간 정보를 제외한 날짜 부분만 비교하면 됩니다. 여기서는 오늘 날짜가 “2019-04-13”이라고 가정하겠습니다.

mysql> select *from DemoTable where ShippingDate > date_sub(curdate(),interval 1 day);

위 쿼리는 curdate()로 현재 날짜를 구한 뒤, date_sub()로 하루를 빼 어제 날짜 이후(즉, 오늘 00:00:00부터)의 모든 레코드를 조회합니다. 실행 결과는 다음과 같습니다.

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2019-04-13 11:34:56 |
+----+---------------------+
1 row in set (0.00 sec)

5. 다른 방법: DATE() 함수 활용

DATE() 함수를 사용하여 DATETIME 값에서 날짜 부분만 추출한 후 비교하는 방법도 있습니다.

mysql> select *from DemoTable where date(ShippingDate) = curdate();

다만 이 방식은 컬럼에 함수를 적용하기 때문에 인덱스를 활용하지 못할 수 있으므로, 대량의 데이터를 다룰 때는 앞서 소개한 범위 비교 방식(> date_sub(curdate(), interval 1 day))이 더 효율적입니다.

마무리

DATETIME 필드에서 오늘의 레코드를 조회할 때는 DATE() 함수로 날짜만 추출하거나, CURDATE()DATE_SUB()를 조합한 범위 조건을 사용하면 됩니다. 성능이 중요한 환경에서는 인덱스를 활용할 수 있는 범위 비교 방식을 권장합니다.