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

MySQL에서 특정 월의 모든 데이터를 조회하는 방법

MySQL에서 특정 월에 해당하는 모든 레코드를 조회하려면 MONTHNAME() 함수 또는 MONTH() 함수를 사용하면 됩니다. 두 함수의 차이점은 MONTHNAME()은 월 이름을 문자열로 반환하고, MONTH()는 월을 숫자(1~12)로 반환한다는 점입니다.

기본 문법

특정 월의 데이터를 조회하는 기본 문법은 다음과 같습니다.

SELECT * FROM yourTableName WHERE MONTHNAME(yourColumnName) = 'yourMonthName';

예제 테이블 생성

실습을 위해 먼저 테이블을 생성해 보겠습니다.

mysql> CREATE TABLE selectAllEntriesDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ShippingDate datetime
    -> );
Query OK, 0 rows affected (0.63 sec)

샘플 데이터 삽입

INSERT 명령어를 사용해 배송 날짜 데이터를 여러 건 입력합니다.

mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2019-01-21');
Query OK, 1 row affected (0.24 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2018-02-24');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2010-10-22');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2011-04-12');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2013-02-10');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2014-02-15');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2016-06-14');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2017-02-14');
Query OK, 1 row affected (0.51 sec)
mysql> INSERT INTO selectAllEntriesDemo(ShippingDate) VALUES('2015-03-29');
Query OK, 1 row affected (0.19 sec)

전체 데이터 확인

SELECT 문으로 테이블에 저장된 모든 레코드를 확인해 보겠습니다.

mysql> SELECT * FROM selectAllEntriesDemo;

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

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 1  | 2019-01-21 00:00:00 |
| 2  | 2018-02-24 00:00:00 |
| 3  | 2010-10-22 00:00:00 |
| 4  | 2011-04-12 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 7  | 2016-06-14 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
| 9  | 2015-03-29 00:00:00 |
+----+---------------------+
9 rows in set (0.00 sec)

방법 1: MONTHNAME() 함수 사용

월 이름을 기준으로 특정 월의 모든 항목을 조회하는 쿼리입니다. 아래 예제는 2월(Feburary)에 해당하는 데이터를 가져옵니다.

mysql> SELECT * FROM selectAllEntriesDemo WHERE MONTHNAME(ShippingDate) = 'February';

실행 결과, 연도와 관계없이 2월에 해당하는 4건의 레코드가 조회됩니다.

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2018-02-24 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
+----+---------------------+
4 rows in set (0.00 sec)

방법 2: MONTH() 함수 사용

동일한 결과를 얻을 수 있는 또 다른 방법은 MONTH() 함수에 월 번호를 지정하는 것입니다. 2월은 숫자 2로 표현합니다.

mysql> SELECT * FROM selectAllEntriesDemo WHERE MONTH(ShippingDate) = 2;

결과는 MONTHNAME()을 사용했을 때와 동일합니다.

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2018-02-24 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
+----+---------------------+
4 rows in set (0.04 sec)

참고 사항

두 방식 모두 결과는 같지만 성능 측면에서 차이가 있을 수 있습니다. 컬럼에 함수를 적용하면 인덱스를 활용하지 못할 수 있으므로, 대용량 테이블에서는 다음과 같이 범위 조건을 사용하는 것이 더 효율적입니다.

SELECT * FROM selectAllEntriesDemo
WHERE ShippingDate >= '2017-02-01' AND ShippingDate < '2017-03-01';

또한 MONTHNAME() 함수의 반환 값은 MySQL 서버의 언어 설정(locale)에 따라 달라질 수 있으므로, 언어 설정과 무관하게 동작하는 MONTH() 함수나 범위 조건 방식을 사용하는 것이 안전합니다.