MySQL에서 특정 달이 며칠까지 있는지, 즉 해당 월의 일수를 구하고 싶을 때가 있습니다. 이럴 때 가장 간단하고 확실한 방법은 LAST_DAY() 함수와 DAY() 함수를 조합하는 것입니다.
핵심 문법
월의 일수를 구하려면 아래 문법을 사용합니다.
SELECT DAY(LAST_DAY(yourColumnName)) AS anyVariableName FROM yourTableName;
여기서 각 함수의 역할은 다음과 같습니다.
- LAST_DAY(date) : 입력된 날짜가 속한 달의 마지막 날짜를 반환합니다. 예를 들어 '2019-01-15'를 넣으면 '2019-01-31'이 반환됩니다.
- DAY(date) : 날짜에서 '일(day)' 부분만 추출합니다. LAST_DAY의 결과인 월말 날짜에 DAY를 적용하면 곧 그 달의 일수가 됩니다.
예제 테이블 생성하기
문법을 실제로 이해하기 위해 먼저 테이블을 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table DaysInaGivenMonth -> ( -> MonthName datetime -> ); Query OK, 0 rows affected (1.62 sec)
샘플 데이터 삽입하기
INSERT 명령으로 현재 시점부터 과거 5개월간의 날짜 데이터를 넣어 보겠습니다.
mysql> insert into DaysInaGivenMonth values(now()); Query OK, 1 row affected (0.24 sec) mysql> insert into DaysInaGivenMonth values(date_add(now(),interval -1 month)); Query OK, 1 row affected (0.16 sec) mysql> insert into DaysInaGivenMonth values(date_add(now(),interval -2 month)); Query OK, 1 row affected (0.10 sec) mysql> insert into DaysInaGivenMonth values(date_add(now(),interval -3 month)); Query OK, 1 row affected (0.20 sec) mysql> insert into DaysInaGivenMonth values(date_add(now(),interval -4 month)); Query OK, 1 row affected (0.23 sec) mysql> insert into DaysInaGivenMonth values(date_add(now(),interval -5 month)); Query OK, 1 row affected (0.15 sec)
저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DaysInaGivenMonth;
실행 결과는 다음과 같습니다.
+---------------------+ | MonthName | +---------------------+ | 2019-01-01 21:34:26 | | 2018-12-01 21:34:55 | | 2018-11-01 21:35:14 | | 2018-10-01 21:35:20 | | 2018-09-01 21:35:23 | | 2018-08-01 21:35:27 | +---------------------+ 6 rows in set (0.00 sec)
월별 일수 조회 쿼리 실행
이제 위에 저장된 각 월의 일수를 계산하는 쿼리는 다음과 같습니다.
mysql> select DAY(LAST_DAY(MonthName)) as DaysInMonth from DaysInaGivenMonth;
실행 결과는 아래와 같습니다.
+-------------+ | DaysInMonth | +-------------+ | 31 | | 31 | | 30 | | 31 | | 30 | | 31 | +-------------+ 6 rows in set (0.00 sec)
결과 분석
결과를 날짜 데이터와 대조해 보면 정확하게 계산된 것을 확인할 수 있습니다.
- 2019년 1월 → 31일
- 2018년 12월 → 31일
- 2018년 11월 → 30일
- 2018년 10월 → 31일
- 2018년 9월 → 30일
- 2018년 8월 → 31일
이처럼 DAY(LAST_DAY(...)) 조합은 윤년(2월 29일)이나 월별 일수 차이를 자동으로 처리해 주기 때문에, 별도의 조건문 없이 항상 정확한 결과를 얻을 수 있다는 큰 장점이 있습니다.