Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 날짜 필드의 월과 일만 비교하는 방법 – DATE_FORMAT() 완벽 가이드

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 이상에서 지원하는 함수 기반 인덱스를 고려하거나, 월·일 값을 별도 컬럼으로 분리해 저장하는 방안도 검토해 보시기 바랍니다.