MySQL에서 실제로 존재하지 않는 날짜(예: 2월 30일)에 INTERVAL 키워드를 사용해 날짜 연산을 수행하면 어떤 일이 일어날까요? 그 답은 allow_invalid_dates 모드의 활성화 여부에 따라 달라집니다.
모드가 비활성화된 경우: NULL 반환
이 모드가 꺼져 있는 기본 상태에서는 MySQL이 잘못된 날짜를 허용하지 않습니다. 따라서 날짜 연산이 수행되지 않고 결과로 NULL이 출력됩니다.
mysql> select '2017-02-30' + INTERVAL 7 day; +-------------------------------+ | '2017-02-30' + INTERVAL 7 day | +-------------------------------+ | NULL | +-------------------------------+ 1 row in set, 1 warning (0.00 sec)
allow_invalid_dates 모드가 활성화된 경우
반면 allow_invalid_dates 모드를 활성화하면 MySQL은 유효하지 않은 날짜도 그대로 받아들여, 마치 정상적인 날짜인 것처럼 날짜 연산을 정상적으로 수행합니다.
mysql> set sql_mode = allow_invalid_dates; Query OK, 0 rows affected (0.05 sec) mysql> select '2017-02-30' + INTERVAL 7 day; +-------------------------------+ | '2017-02-30' + INTERVAL 7 day | +-------------------------------+ | 2017-03-09 | +-------------------------------+ 1 row in set (0.00 sec) mysql> select '2017-11-31' + INTERVAL 7 day; +-------------------------------+ | '2017-11-31' + INTERVAL 7 day | +-------------------------------+ | 2017-12-08 | +-------------------------------+ 1 row in set (0.00 sec)
위 실행 결과를 보면 '2017-02-30'에 7일을 더한 값은 '2017-03-09'로 계산되고, '2017-11-31'에 7일을 더한 값은 '2017-12-08'로 계산됩니다. 즉, 존재하지 않는 날짜라도 해당 월의 마지막 날을 기준으로 자연스럽게 다음 달로 넘어가 연산됩니다.
정리하면, 잘못된 날짜에 대한 INTERVAL 연산 결과는 sql_mode에서 allow_invalid_dates 옵션의 설정 상태에 전적으로 의존한다는 점을 기억해 두시면 됩니다.