MySQL에서 이번 달의 첫날 구하기
MySQL에서는 LAST_DAY() 함수와 DATE_SUB() 함수를 조합하면 이번 달의 첫날을 손쉽게 구할 수 있습니다. 아래 쿼리를 살펴보겠습니다.
mysql> SELECT DATE_SUB(LAST_DAY(NOW()), INTERVAL DAY(LAST_DAY(NOW())) - 1 DAY) AS 'FIRST DAY OF CURRENT MONTH'; +----------------------------+ | FIRST DAY OF CURRENT MONTH | +----------------------------+ | 2017-10-01 | +----------------------------+ 1 row in set (0.00 sec)
쿼리 동작 원리
이 쿼리가 작동하는 방식을 단계별로 살펴보면 다음과 같습니다.
- NOW(): 현재 날짜와 시간을 반환합니다.
- LAST_DAY(NOW()): 현재 달의 마지막 날짜를 반환합니다. 예를 들어 10월이라면 '2017-10-31'이 됩니다.
- DAY(LAST_DAY(NOW())): 해당 월의 마지막 날짜에서 '일(day)' 부분만 추출합니다. 10월이면 31이 됩니다.
- DATE_SUB(..., INTERVAL ... DAY): 마지막 날짜에서 (일수 - 1)만큼 빼서 그 달의 1일을 계산합니다.
더 간단한 대체 방법
DATE_FORMAT() 함수를 사용하면 훨씬 간결하게 같은 결과를 얻을 수 있습니다.
mysql> SELECT DATE_FORMAT(NOW(), '%Y-%m-01') AS 'FIRST DAY OF CURRENT MONTH'; +----------------------------+ | FIRST DAY OF CURRENT MONTH | +----------------------------+ | 2017-10-01 | +----------------------------+ 1 row in set (0.00 sec)
또한 문자열 연결 방식으로도 가능합니다.
mysql> SELECT CONCAT(YEAR(CURDATE()), '-', MONTH(CURDATE()), '-01') AS 'FIRST DAY OF CURRENT MONTH';
참고 사항
NOW() 대신 CURDATE()를 사용해도 동일한 결과를 얻을 수 있습니다. 두 함수 모두 현재 날짜를 기준으로 동작하지만, NOW()는 시간까지 포함하고 CURDATE()는 날짜만 반환한다는 차이가 있습니다. 이번 달 첫날을 구하는 용도로는 어느 쪽을 사용해도 무방합니다.