MySQL에서 날짜를 저장할 때 월과 연도만 별도로 저장하는 것보다 전체 날짜 시간(datetime)으로 저장하는 것이 좋습니다. datetime 타입으로 선언해 두면 MySQL의 MONTH() 함수와 YEAR() 함수를 사용해 언제든지 월과 연도를 손쉽게 추출할 수 있기 때문입니다.
기본 문법
datetime 컬럼에서 월과 연도를 추출하는 기본 문법은 다음과 같습니다.
select MONTH(yourDateTimeColumnName) as anyVariableName1,
YEAR(yourDateTimeColumnName) as anyVariableName2
from yourTableName;
예제 테이블 생성
위 문법을 이해하기 위해 실제 테이블을 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.
mysql> create table OnlyMonthandYear
-> (
-> DueDateTime datetime
-> );
Query OK, 0 rows affected (0.56 sec)
데이터 삽입
insert 명령어를 사용해 테이블에 날짜 데이터를 삽입합니다.
mysql> insert into OnlyMonthandYear values('2016-12-10');
Query OK, 1 row affected (0.19 sec)
mysql> insert into OnlyMonthandYear values('2017-10-21');
Query OK, 1 row affected (0.15 sec)
mysql> insert into OnlyMonthandYear values('2018-03-25');
Query OK, 1 row affected (0.31 sec)
mysql> insert into OnlyMonthandYear values('2018-12-18');
Query OK, 1 row affected (0.20 sec)저장된 데이터 확인
select 명령어로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from OnlyMonthandYear;
+---------------------+
| DueDateTime |
+---------------------+
| 2016-12-10 00:00:00 |
| 2017-10-21 00:00:00 |
| 2018-03-25 00:00:00 |
| 2018-12-18 00:00:00 |
+---------------------+
4 rows in set (0.00 sec)
월과 연도만 추출하기
이제 datetime 타입 컬럼에서 월과 연도만 추출하는 쿼리를 실행해 보겠습니다.
mysql> select Month(DueDateTime) as OnlyMonth,Year(DueDateTime) as OnlyYear from
OnlyMonthandYear;
실행 결과
+-----------+----------+
| OnlyMonth | OnlyYear |
+-----------+----------+
| 12 | 2016 |
| 10 | 2017 |
| 3 | 2018 |
| 12 | 2018 |
+-----------+----------+
4 rows in set (0.02 sec)
참고로 DATE_FORMAT(DueDateTime, '%Y-%m')처럼 DATE_FORMAT 함수를 활용하면 '2016-12'와 같은 형태의 문자열로 월과 연도를 한 번에 추출할 수도 있습니다. 전체 날짜를 저장해 두면 정렬, 범위 검색, 그룹화 등 다양한 연산에서 훨씬 유연하게 대응할 수 있다는 점도 기억해 두세요.