MySQL에서 DATETIME 타입의 값에서 3시간을 빼야 하는 경우가 종종 있습니다. 예를 들어 로그 기록 시간 보정이나 시간대 차이 계산 등이 대표적인 활용 사례입니다. 이때 DATE_ADD() 함수와 DATE_SUB() 함수를 사용하면 간단하게 처리할 수 있습니다.
방법 1: DATE_ADD() 함수 사용하기
DATE_ADD()는 이름 그대로 날짜와 시간을 더하는 함수이지만, 음수 값을 전달하면 빼기 연산과 동일한 효과를 냅니다.
SELECT DATE_ADD(컬럼명, INTERVAL -3 HOUR) FROM 테이블명;
방법 2: DATE_SUB() 함수 사용하기
DATE_SUB()는 날짜와 시간을 빼는 전용 함수입니다. 더 직관적이므로 시간을 감산할 때는 이 방법을 권장합니다.
SELECT DATE_SUB(컬럼명, INTERVAL 3 HOUR) FROM 테이블명;
실전 예제로 확인하기
먼저 NOW() 함수를 사용해 현재 날짜와 시간을 확인해 보겠습니다.
mysql> SELECT NOW();
실행 결과는 다음과 같습니다.
+---------------------+ | now() | +---------------------+ | 2018-11-30 10:13:23 | +---------------------+ 1 row in set (0.00 sec)
DATE_ADD() 적용 결과
이제 DATE_ADD()에 음수 간격(-3시간)을 지정하여 현재 시간에서 3시간을 빼 보겠습니다.
mysql> SELECT DATE_ADD(NOW(), INTERVAL -3 HOUR);
결과를 확인하면 3시간이 정상적으로 차감된 것을 볼 수 있습니다.
+----------------------------------+ | date_add(now(),interval -3 hour) | +----------------------------------+ | 2018-11-30 07:13:28 | +----------------------------------+ 1 row in set (0.00 sec)
DATE_SUB() 적용 결과
다시 한번 현재 날짜와 시간을 조회합니다.
mysql> SELECT NOW();
+---------------------+ | now() | +---------------------+ | 2018-11-30 10:14:12 | +---------------------+ 1 row in set (0.00 sec)
두 번째 방법인 DATE_SUB()를 적용한 쿼리는 다음과 같습니다.
mysql> SELECT DATE_SUB(NOW(), INTERVAL 3 HOUR);
마찬가지로 3시간이 빠진 결과가 출력됩니다.
+---------------------------------+ | date_sub(now(),interval 3 hour) | +---------------------------------+ | 2018-11-30 07:14:25 | +---------------------------------+ 1 row in set (0.00 sec)
정리 및 추가 팁
두 함수 모두 동일한 결과를 반환하지만, 의미상으로는 시간을 뺄 때 DATE_SUB()를 사용하는 것이 코드 가독성 측면에서 더 좋습니다. 또한 INTERVAL 단위는 HOUR 외에도 DAY, MONTH, YEAR, MINUTE, SECOND 등 다양하게 지원되므로 필요에 따라 유연하게 활용할 수 있습니다.
참고로 특정 컬럼의 값을 기준으로 연산하고 싶다면 NOW() 대신 해당 컬럼명을 넣으면 되며, 결과를 다른 컬럼에 저장하려면 UPDATE 문과 함께 조합하여 사용하면 됩니다.