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

MySQL에서 특정 연도와 월의 레코드를 조회하는 방법 (YEAR, MONTH 함수 활용)

MySQL에서 특정 연도와 월에 해당하는 레코드를 조회하려면 YEAR() 함수와 MONTH() 함수를 사용하면 됩니다. 먼저 예제로 사용할 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
    (
    CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    CustomerName varchar(20),
    CustomerTotalBill int,
    PurchasingDate date
    );
Query OK, 0 rows affected (0.83 sec)

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

mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('John',2000,'2019-01-21');
Query OK, 1 row affected (0.12 sec)

mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Chris',1000,'2019-01-31');
Query OK, 1 row affected (0.21 sec)

mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Robert',4500,'2018-01-01');
Query OK, 1 row affected (0.24 sec)

mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Sam',5500,'2017-02-12');
Query OK, 1 row affected (0.14 sec)

mysql> insert into DemoTable(CustomerName,CustomerTotalBill,PurchasingDate) values('Carol',500,'2016-01-12');
Query OK, 1 row affected (0.17 sec)

SELECT 문을 실행하여 테이블에 저장된 전체 레코드를 확인합니다.

mysql> select *from DemoTable;

위 쿼리는 다음과 같은 결과를 출력합니다.

+------------+--------------+-------------------+----------------+
| CustomerId | CustomerName | CustomerTotalBill | PurchasingDate |
+------------+--------------+-------------------+----------------+
| 1          | John         | 2000              | 2019-01-21     |
| 2          | Chris        | 1000              | 2019-01-31     |
| 3          | Robert       | 4500              | 2018-01-01     |
| 4          | Sam          | 5500              | 2017-02-12     |
| 5          | Carol        | 500               | 2016-01-12     |
+------------+--------------+-------------------+----------------+
5 rows in set (0.00 sec)

특정 연도와 월의 레코드 조회하기

다음은 MySQL에서 특정 연도와 월에 해당하는 레코드만 조회하는 쿼리입니다. WHERE 절에서 YEAR() 함수로 연도를, MONTH() 함수로 월을 각각 비교합니다.

mysql> select *from DemoTable WHERE YEAR(DATE(PurchasingDate))=2019 AND MONTH(DATE(PurchasingDate)) = 01;

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

+------------+--------------+-------------------+----------------+
| CustomerId | CustomerName | CustomerTotalBill | PurchasingDate |
+------------+--------------+-------------------+----------------+
| 1          | John         | 2000              | 2019-01-21     |
| 2          | Chris        | 1000              | 2019-01-31     |
+------------+--------------+-------------------+----------------+
2 rows in set (0.03 sec)

결과를 보면 구매일(PurchasingDate)이 2019년 1월인 John과 Chris의 레코드만 정확하게 필터링되어 반환된 것을 확인할 수 있습니다.

성능 최적화 팁

YEAR(), MONTH()처럼 컬럼에 함수를 적용하면 해당 컬럼에 인덱스가 있더라도 인덱스를 활용할 수 없어, 데이터가 많은 테이블에서는 조회 속도가 느려질 수 있습니다. 이 경우 아래와 같이 날짜 범위 조건을 사용하는 것이 더 효율적입니다.

mysql> select *from DemoTable 
WHERE PurchasingDate >= '2019-01-01' AND PurchasingDate < '2019-02-01';

두 방식 모두 동일한 결과를 반환하지만, 범위 조건 방식은 인덱스 스캔이 가능하므로 대용량 데이터 환경에서 권장됩니다.