날짜 값을 인수로 받아 두 날짜 사이의 년, 월, 일 차이를 반환하는 사용자 정의 함수를 직접 만들 수 있습니다. 아래 예제는 MySQL에서 TIMESTAMPDIFF 함수와 사용자 변수를 조합하여 이를 구현하는 방법을 보여줍니다.
mysql> CREATE FUNCTION date_difference(Date1 DATE, date2 DATE) RETURNS VARCHAR(30) -> RETURN CONCAT( -> @years := TIMESTAMPDIFF(YEAR, date1, date2),IF (@years = 1, ' year, ', ' years, '), -> @months := TIMESTAMPDIFF(MONTH, DATE_ADD(date1, INTERVAL @years YEAR), date2),IF (@months = 1, ' month, ', ' months, '), -> @days := TIMESTAMPDIFF(DAY, DATE_ADD(date1, INTERVAL @years * 12 + @months MONTH), date2),IF (@days = 1, ' day', ' days')) ; Query OK, 0 rows affected (0.00 sec)
함수의 동작 원리
이 함수는 다음과 같은 순서로 차이를 계산합니다.
- 년(year) 계산:
TIMESTAMPDIFF(YEAR, ...)를 사용해 두 날짜 사이의 전체 경과 연도를 구합니다. - 월(month) 계산: 시작 날짜에 계산된 연도를 더한 뒤, 남은 개월 수를 구합니다.
- 일(day) 계산: 시작 날짜에 연도와 개월을 모두 더한 뒤, 남은 일수를 구합니다.
IF조건문은 값이 1일 때는 단수형('year'), 그 외에는 복수형('years')을 출력하도록 처리합니다.
함수 실행 예제
함수 생성이 완료되면 이제 date_difference 함수에 날짜 값을 인수로 전달하여 호출할 수 있습니다.
mysql> Select date_difference('2015-11-16','2016-12-17') AS Difference;
+------------------------+
| Difference |
+------------------------+
| 1 year, 1 month, 1 day |
+------------------------+
1 row in set (0.00 sec)위 결과 집합을 보면, 함수의 인수로 지정된 두 날짜('2015-11-16'과 '2016-12-17') 사이의 차이가 정확히 1년 1개월 1일임을 확인할 수 있습니다. 이처럼 사용자 정의 함수를 활용하면 DATEDIFF나 TIMESTAMPDIFF만으로는 얻기 어려운 년·월·일 단위의 세밀한 기간 계산을 손쉽게 처리할 수 있습니다.