MySQL에서 날짜(DATE) 타입 컬럼을 비교할 때 연도는 제외하고 월과 일만 비교해야 하는 경우가 종종 있습니다. 예를 들어 '생일이 몇 월 며칠인지 확인'하거나 '매년 반복되는 기념일을 조회'하는 상황이 대표적입니다. 이럴 때 DATE_FORMAT() 함수를 사용하면 간단하게 해결할 수 있습니다.
DATE_FORMAT()을 이용한 월·일 비교 문법
기본적인 문법은 다음과 같습니다. 날짜 값을 '%m-%d' 형식(월-일)으로 변환한 뒤 서로 비교합니다.
SELECT * FROM yourTableName
WHERE DATE_FORMAT(yourColumnName, '%m-%d') = DATE_FORMAT('yourValue', '%m-%d')
AND yourCondition;예제 테이블 생성하기
실제 동작을 확인하기 위해 예제 테이블을 먼저 만들어 보겠습니다.
mysql> CREATE TABLE compareDayAndMonthDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> compareDayAndTime date
-> );
Query OK, 0 rows affected (0.49 sec)샘플 데이터 삽입
INSERT 명령으로 여러 날짜 데이터를 입력합니다.
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2014-01-31');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2014-10-11');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2016-09-12');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2017-04-25');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2018-12-25');
Query OK, 1 row affected (0.08 sec)
mysql> INSERT INTO compareDayAndMonthDemo(compareDayAndTime) VALUES('2019-02-27');
Query OK, 1 row affected (0.07 sec)전체 데이터 조회
SELECT 문으로 테이블에 저장된 모든 레코드를 확인합니다.
mysql> SELECT * FROM compareDayAndMonthDemo;
실행 결과는 다음과 같습니다.
+----+-------------------+ | Id | compareDayAndTime | +----+-------------------+ | 1 | 2014-01-31 | | 2 | 2014-10-11 | | 3 | 2016-09-12 | | 4 | 2017-04-25 | | 5 | 2018-12-25 | | 6 | 2019-02-27 | +----+-------------------+ 6 rows in set (0.00 sec)
월과 일만 비교하는 쿼리 실행
이제 연도와 무관하게 월과 일만 비교해 보겠습니다. 아래 쿼리는 '01-31'(1월 31일)과 월·일이 일치하는 데이터를 조회합니다.
mysql> SELECT * FROM compareDayAndMonthDemo
-> WHERE DATE_FORMAT(compareDayAndTime, '%m-%d') = DATE_FORMAT('2019-01-31', '%m-%d') AND Id=1;비교 기준 날짜가 '2019-01-31'이지만, 실제 저장된 값은 '2014-01-31'입니다. 그럼에도 결과가 반환되는 이유는 연도를 무시하고 월(01)과 일(31)만 비교했기 때문입니다.
+----+-------------------+ | Id | compareDayAndTime | +----+-------------------+ | 1 | 2014-01-31 | +----+-------------------+ 1 row in set (0.00 sec)
월·일 값만 따로 출력하기
날짜 전체가 아니라 월과 일 값 자체만 결과로 받고 싶다면 SELECT 절에서도 DATE_FORMAT()을 사용하면 됩니다.
mysql> SELECT DATE_FORMAT(compareDayAndTime, '%m-%d') AS DayAndMonthOnly FROM compareDayAndMonthDemo
-> WHERE DATE_FORMAT(compareDayAndTime, '%m-%d') = DATE_FORMAT('2019-01-31', '%m-%d') AND Id=1;결과는 다음과 같이 'MM-DD' 형식으로 깔끔하게 출력됩니다.
+-----------------+ | DayAndMonthOnly | +-----------------+ | 01-31 | +-----------------+ 1 row in set (0.00 sec)
성능 관련 참고 사항
DATE_FORMAT()처럼 컬럼에 함수를 적용하면 해당 조건에는 인덱스를 사용할 수 없어 대량의 데이터를 조회할 때 성능이 저하될 수 있습니다. 데이터 건수가 많다면 MySQL 5.6 이상에서 지원하는 함수 기반 인덱스를 고려하거나, 월·일 값을 별도 컬럼으로 분리해 저장하는 방안도 검토해 보시기 바랍니다.