MySQL에서 datetime 값의 시간은 그대로 유지하면서 날짜만 변경하고 싶다면 INTERVAL과 함께 YEAR, MONTH, DAY 등의 단위를 활용하면 됩니다. 레코드를 수정해야 하므로 UPDATE 문과 함께 INTERVAL>을 사용해 새로운 값을 설정합니다.
예제 테이블 생성하기
먼저 예제로 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
(
DueDate datetime
);
Query OK, 0 rows affected (0.56 sec)샘플 데이터 삽입하기
INSERT 명령을 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable values('2017-08-12 10:30:45');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('2015-09-21 12:00:00');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2018-12-31 11:45:56');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2016-01-02 01:23:04');
Query OK, 1 row affected (0.14 sec)현재 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------+ | DueDate | +---------------------+ | 2017-08-12 10:30:45 | | 2015-09-21 12:00:00 | | 2018-12-31 11:45:56 | | 2016-01-02 01:23:04 | +---------------------+ 4 rows in set (0.00 sec)
시간은 유지하고 날짜만 변경하는 쿼리
이제 시간 값은 그대로 두고 날짜(연도)만 변경하는 쿼리입니다. DUEDate + INTERVAL 1 YEAR처럼 기존 값에 인터벌을 더하면 시간 부분은 자동으로 보존됩니다.
mysql> update DemoTable
set DueDate=DueDate+interval 1 year;
Query OK, 4 rows affected (0.16 sec)
Rows matched : 4 Changed : 4 Warnings : 0변경 결과 확인하기
테이블의 레코드를 다시 한번 조회해 결과를 확인해 보겠습니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+---------------------+ | DueDate | +---------------------+ | 2018-08-12 10:30:45 | | 2016-09-21 12:00:00 | | 2019-12-31 11:45:56 | | 2017-01-02 01:23:04 | +---------------------+ 4 rows in set (0.00 sec)
출력 결과를 보면 모든 레코드의 연도가 정확히 1년씩 증가했지만, 시·분·초 값은 원본 그대로 유지된 것을 확인할 수 있습니다.
참고: 다른 날짜 단위 활용하기
같은 방식으로 INTERVAL 1 MONTH(월), INTERVAL 1 DAY(일) 등 다양한 단위를 사용할 수 있으며, 음수 값을 넣으면 과거 날짜로 변경할 수도 있습니다. 예를 들어 set DueDate=DueDate - interval 1 year;처럼 작성하면 연도가 1년 감소합니다.