[MySQL] 날짜 더하기, 빼기 함수 (DATE_ADD, DATE_SUB) 이해하기
MySQL(MariaDB 포함)에서 날짜값을 더하거나 뺄 때 사용하는 함수는 DATE_ADD와 DATE_SUB가 있다. 이 함수를 사용해서 현재일보다 7일 전, 한달 전과 같은 데이터를 가지고 오거나 시한이 있는 컨텐츠의 경우 마감일을 지정한다든지 하는 로직등을 구현할 수 있다.
DATE_ADD 및 DATE_SUB 사용법
DATE_ADD(date, INTERVAL value interval_type)
DATE_SUB(date, INTERVAL value interval_type)
날짜를 더하거나 빼는 방법은 메소드만 다를 뿐 사용 방법은 동일하다.
- 첫번째 인자인 date는 수정해야 할 대상 날짜값이다.
- 두번째 인자인 value는 더하거나 뺄 시간 값이고, interval_type는 시간 유형이다.
시간 유형
유형 | 내용 |
MICROSECOND | 마이크로 초, 즉 백만분의 1초 |
SECOND | 초 |
MINUTE | 분 |
HOUR | 시 |
DAY | 일 |
WEEK | 주 |
MONTH | 달 |
QUARTER | 분기 |
YEAR | 년도 |
참고로 시간 유형은 조합을 해서 좀 더 디테일한 날짜값을 조절할 수 있다. 예를 들어 7일 5시간 후와 같은 복잡한 시간 값도 위의 시간 유형을 조합해서 만들 수 있다.
DATE_ADD 및 DATE_SUB 예제
참고로 시간은 2022년 10월 11일 오전 10시라고 가정
현재 시간에 0.5초 더하기 및 빼기
select date_add(now(), interval 500000 MICROSECOND);
// 2022-10-11 10:00:00.500
select date_sub(now(), interval 500000 MICROSECOND);
// 2022-10-11 09:59:59.500
현재 시간에서 5초 더하기 및 빼기
select date_add(now(), interval 5 SECOND);
// 2022-10-11 10:00:05
select date_sub(now(), interval 5 SECOND);
// 2022-10-06 10:00:00
현재 시간에 10분 더하기 및 빼기
select date_add(now(), interval 10 MINUTE);
// 2022-10-11 10:10:00
select date_sub(now(), interval 10 MINUTE);
// 2022-10-11 09:50:00
현재 시간에 1시간 더하기 및 빼기
select date_add(now(), interval 1 HOUR);
// 2022-10-11 11:00:00
select date_sub(now(), interval 1 HOUR);
// 2022-10-11 09:00:00
현재 시간에 5일 더하기 및 빼기
select date_add(now(), interval 5 DAY);
// 2022-10-16 10:00:00
select date_sub(now(), interval 5 DAY);
// 2022-10-06 10:00:00
현재 시간에 2달 더하기
select date_add(now(), interval 2 MONTH);
// 2022-12-11 10:00:00
select date_sub(now(), interval 2 MONTH);
// 2022-08-11 10:00:00
현재 시간에 1분기(3개월) 더하기
select date_add(now(), interval 1 QUARTER);
// 2023-01-11 10:00:00
select date_sub(now(), interval 1 QUARTER);
// 2022-07-11 10:00:00
현재 시간에 10년 더하기
select date_add(now(), interval 10 YEAR);
// 2032-10-11 10:00:00
select date_sub(now(), interval 10 YEAR);
// 2012-10-11 10:00:00
위에서 설명한 것처럼 10시 10분 뒤와 같이 디테일한 설정들도 유형의 조합을 통해서 제공하고 있다. 다만 조합의 경우 아무렇게나 조합을 만드는 것이 아니라 정해진 규칙이 존재한다.
시간 유형 조합
조합 매개변수 | 조합 명칭 | 형식 |
SECOND_MICROSECOND | 초 마이크로초 | 초.마이크로초 |
MINUTE_MICROSECOND | 분 마이크로초 | 분:초.마이크로초 |
MINUTE_SECOND | 분 초 | 분:초 |
HOUR_MICROSECOND | 시간 마이크로초 | 시간:분:초.마이크로초 |
HOUR_SECOND | 시간 초 | 시간:분:초 |
HOUR_MINUTE | 시간 분 | 시간:분 |
DAY_MICROSECOND | 일 마이크로초 | 일 시간:분:초.마이크로초 |
DAY_SECOND | 일 초 | 일 시간:분:초 |
DAY_MINUTE | 일 분 | 일 시간:분 |
DAY_HOUR | 일 시간 | 일 시간 |
YEAR_MONTH | 년 월 | 년-월 |
- 위의 매개변수와 같이 조합의 경우 최대 값과 최소값을 조합하여 매개변수가 만들어지는 것을 확인할 수 있다. 예를 들어 5시간 10분 52초와 같은 경우, 사이에 껴 있는 분(Minute)이 아닌 시(Hour)와 초(Second)가 최대와 최소값이니 HOUR_SECOND와 같은 조합이 만들어진다. 이 패턴을 이해한다면, 위의 매개변수를 외우지 않아도 충분히 활용할 수 있을 것이다.
시간 유형 조합 예시
DAY_HOUR
예시) 5일 2시간을 더하기
select date_add(now(), interval '5 2' DAY_HOUR);
// 2022-10-16 12:00:00
HOUR_SECOND
예시) 2시간 10분 5초를 더하기
select date_add(now(), interval '2:10:5' HOUR_SECOND);
// 2022-10-11 12:10:05
위와 같이 시간 유형 조합의 경우 디테일한 시간을 추가 혹은 뺄 수 있기 때문에 보다 유용하게 날짜값을 계산할 수 있게 될 것이다.
연관 포스팅
[MySQL] date_format 설정 (날짜 포맷 변경)