날짜 값을 문자열 형태로 표현한 상태에서 덧셈(+), 뺄셈(-), 곱셈(*), 나눗셈(/) 같은 산술 연산자를 적용하면 결과를 예측하기 매우 어렵습니다.
그 이유는 MySQL이 문자열로 된 날짜에 숫자 연산을 수행할 때, 전체 날짜를 계산하는 것이 아니라 문자열 앞부분에 나타나는 숫자만 추출하여 사용하기 때문입니다. 예를 들어 '2017-10-17'이라는 문자열은 숫자로 변환될 때 '2017'만 인식되며, 뒤의 '-10-17' 부분은 무시됩니다.
예제로 확인하기
다음 예제들을 통해 실제 동작 방식을 살펴보겠습니다.
1. 덧셈(+) 연산
mysql> select '2017-10-17' + 20; +-------------------+ | '2017-10-17' + 20 | +-------------------+ | 2037 | +-------------------+ 1 row in set, 1 warning (0.00 sec)
'2017-10-17'에서 숫자 부분인 2017만 추출된 후 20이 더해져 결과가 2037이 되었습니다. 날짜에 20일을 더한 값이 아니라는 점에 주의해야 합니다.
2. 뺄셈(-) 연산
mysql> select '2017-10-25' - 17; +-------------------+ | '2017-10-25' - 17 | +-------------------+ | 2000 | +-------------------+ 1 row in set, 1 warning (0.00 sec)
마찬가지로 2017 - 17 = 2000이라는 결과가 반환됩니다.
3. 곱셈(*) 연산
mysql> select '2017-10-17' * 2; +-------------------+ | '2017-10-17' * 20 | +-------------------+ | 4034 | +-------------------+ 1 row in set, 1 warning (0.00 sec)
2017 * 2 = 4034로 계산됩니다.
4. 나눗셈(/) 연산
mysql> select '2017-05-25'/5; +----------------+ | '2017-05-25'/5 | +----------------+ | 403.4 | +----------------+ 1 row in set, 1 warning (0.00 sec)
2017 / 5 = 403.4라는 결과가 출력됩니다.
결론: 올바른 날짜 연산 방법
위 예제에서 볼 수 있듯이, 문자열 형태의 날짜에 산술 연산자를 직접 사용하면 의도와 전혀 다른 엉뚱한 결과가 나옵니다. 또한 각 쿼리 실행 시 warning이 발생한다는 점도 주목할 필요가 있습니다.
날짜에 일수를 더하거나 빼는 등의 연산을 수행하려면 반드시 DATE_ADD(), DATE_SUB() 함수나 INTERVAL 구문을 사용해야 합니다. 예를 들어 다음과 같이 작성하는 것이 올바른 방법입니다.
mysql> SELECT DATE_ADD('2017-10-17', INTERVAL 20 DAY);
+-----------------------------------------+
| DATE_ADD('2017-10-17', INTERVAL 20 DAY) |
+-----------------------------------------+
| 2017-11-06 |
+-----------------------------------------+이처럼 MySQL에서 날짜 연산을 할 때는 항상 전용 날짜 함수를 사용하는 것이 안전하고 정확합니다.