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() 함수나 범위 조건 방식을 사용하는 것이 안전합니다.