MySQL에서는 DATE_FORMAT() 함수를 사용하여 각 날짜가 속한 달의 첫날을 손쉽게 구할 수 있습니다. 이 함수는 날짜 형식을 지정하는 포맷 문자열을 받아 원하는 형태로 변환해 주는데, '%Y-%m-01'과 같이 일(day) 부분을 '01'로 고정하면 해당 월의 첫날이 됩니다.
기본 문법
SELECT DATE_FORMAT(날짜컬럼명, '%Y-%m-01') AS 별칭 FROM 테이블명;
문법을 더 잘 이해하기 위해 실제 예제를 통해 단계별로 살펴보겠습니다.
1. 테이블 생성
먼저 datetime 타입의 컬럼을 가진 테이블을 생성합니다.
mysql> CREATE TABLE getFirstDayOfMonth
-> (
-> DueDatetime DATETIME
-> );
Query OK, 0 rows affected (1.16 sec)2. 샘플 데이터 삽입
INSERT 명령어를 사용하여 현재 시점을 기준으로 다양한 월의 날짜 데이터를 입력합니다.
mysql> INSERT INTO getFirstDayOfMonth VALUES(DATE_ADD(NOW(), INTERVAL 3 MONTH)); Query OK, 1 row affected (0.30 sec) mysql> INSERT INTO getFirstDayOfMonth VALUES(DATE_ADD(NOW(), INTERVAL -3 MONTH)); Query OK, 1 row affected (0.13 sec) mysql> INSERT INTO getFirstDayOfMonth VALUES(DATE_ADD(NOW(), INTERVAL -2 MONTH)); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO getFirstDayOfMonth VALUES(DATE_ADD(NOW(), INTERVAL -1 MONTH)); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO getFirstDayOfMonth VALUES(DATE_ADD(NOW(), INTERVAL -4 MONTH)); Query OK, 1 row affected (0.10 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회합니다.
mysql> SELECT * FROM getFirstDayOfMonth;
출력 결과
+---------------------+ | DueDatetime | +---------------------+ | 2019-03-20 12:32:06 | | 2018-09-20 12:32:16 | | 2018-10-20 12:32:22 | | 2018-11-20 12:32:28 | | 2018-08-20 12:32:33 | +---------------------+ 5 rows in set (0.00 sec)
4. 해당 월의 첫날 조회하기
이제 DATE_FORMAT() 함수를 적용하여 각 날짜가 속한 월의 첫날을 반환하는 쿼리를 실행합니다. 컬럼에 어떤 날짜가 저장되어 있든, 아래 쿼리는 각각 해당 월의 1일을 결과로 돌려줍니다.
mysql> SELECT DATE_FORMAT(DueDatetime, '%Y-%m-01') AS DateDemo FROM getFirstDayOfMonth;
출력 결과
+------------+ | DateDemo | +------------+ | 2019-03-01 | | 2018-09-01 | | 2018-10-01 | | 2018-11-01 | | 2018-08-01 | +------------+ 5 rows in set (0.00 sec)
추가 팁: 다른 방법들
DATE_FORMAT() 외에도 MySQL에서는 여러 가지 방법으로 월의 첫날을 구할 수 있습니다.
- DATE_SUB + DAYOFMONTH 조합:
DATE_SUB(yourDate, INTERVAL DAYOFMONTH(yourDate)-1 DAY)를 사용하면 해당 월의 첫날을 datetime 타입 그대로 얻을 수 있습니다. - LAST_DAY 함수 응용:
DATE_SUB(LAST_DAY(yourDate), INTERVAL DAY(LAST_DAY(yourDate))-1 DAY)방식도 가능합니다.
단순히 문자열 형태의 'YYYY-MM-01' 값만 필요하다면 DATE_FORMAT()이 가장 간결하고 직관적인 선택입니다. 반면 날짜 연산을 추가로 수행해야 한다면 DATE_SUB 방식이 유용할 수 있습니다.