MySQL에서 현재 날짜와 월(Month)과 일(Day)이 같은 레코드를 조회하려면 MONTH() 함수와 DAY() 함수를 함께 사용하면 됩니다. 이 방법은 기념일처럼 연도와 관계없이 특정 월·일에 해당하는 데이터를 찾을 때 특히 유용합니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable1429
-> (
-> AnniversaryDate date
-> );
2. 샘플 데이터 삽입하기
INSERT 문을 이용해 몇 개의 기념일 날짜를 입력합니다.
mysql> insert into DemoTable1429 values('2019-09-29');
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable1429 values('2018-09-27');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable1429 values('2016-09-28');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1429 values('2015-09-29');
Query OK, 1 row affected (0.12 sec)3. 전체 레코드 확인하기
SELECT 문으로 테이블에 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable1429;
실행 결과는 다음과 같습니다.
+-----------------+
| AnniversaryDate |
+-----------------+
| 2019-09-29 |
| 2018-09-27 |
| 2016-09-28 |
| 2015-09-29 |
+-----------------+
4 rows in set (0.00 sec)
4. 현재 날짜 확인하기
CURDATE() 함수로 오늘 날짜를 먼저 확인합니다. 예제 기준 현재 날짜는 2019년 9월 29일입니다.
mysql> select curdate();
+------------+
| curdate() |
+------------+
| 2019-09-29 |
+------------+
1 row in set (0.00 sec)
5. 현재 날짜의 월·일과 비교하는 쿼리
이제 MONTH()와 DAY() 함수를 WHERE 절에 적용하여, 저장된 날짜의 월과 일이 현재 날짜의 월과 일과 일치하는 레코드만 조회해 보겠습니다.
mysql> select * from DemoTable1429
-> where month(AnniversaryDate)=month(curdate())
-> and day(AnniversaryDate)=day(curdate());
실행 결과는 다음과 같습니다.
+-----------------+
| AnniversaryDate |
+-----------------+
| 2019-09-29 |
| 2015-09-29 |
+-----------------+
2 rows in set (0.00 sec)
결과 해석
현재 날짜가 2019-09-29이므로, 월(09)과 일(29)이 모두 일치하는 2019-09-29와 2015-09-29 두 개의 레코드만 반환되었습니다. 연도가 달라도 월과 일만 같으면 조회되는 것을 확인할 수 있습니다.
참고 사항
이 쿼리는 매년 반복되는 기념일, 생일 알림, 정기 이벤트 대상자 추출 등에 활용할 수 있습니다. 단, 컬럼에 함수를 적용하면 인덱스를 활용하지 못할 수 있으므로, 대용량 테이블에서는 별도의 월·일 컬럼을 추가하거나 생성된 컬럼(generated column)과 인덱스를 함께 사용하는 것이 성능 면에서 유리합니다.