개요
날짜·시간 연산이 필요할 때 MySQL에서는 DATE_SUB() 함수를 사용하면 간단하게 처리할 수 있습니다. 이 글에서는 이미 테이블에 저장된 DATETIME 값을 '현재 시간에서 1시간을 뺀 값'으로 일괄 업데이트하는 과정을 단계별로 살펴보겠습니다.
1. 테이블 생성하기
먼저 예제에 사용할 테이블을 생성합니다.
mysql> create table DemoTable1434
-> (
-> ArrivalDatetime datetime
-> );
Query OK, 0 rows affected (3.14 sec)
2. 샘플 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 넣어 보겠습니다.
mysql> insert into DemoTable1434 values('2019-09-30 21:10:00');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1434 values('2018-09-30 22:20:40');
Query OK, 1 row affected (0.33 sec)
mysql> insert into DemoTable1434 values('2017-09-30 23:10:00');
Query OK, 1 row affected (0.19 sec)3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select * from DemoTable1434;
실행 결과는 다음과 같습니다.
+---------------------+
| ArrivalDatetime |
+---------------------+
| 2019-09-30 21:10:00 |
| 2018-09-30 22:20:40 |
| 2017-09-30 23:10:00 |
+---------------------+
3 rows in set (0.00 sec)
4. 현재 시간에서 1시간을 뺀 값으로 업데이트하기
다음은 DATE_SUB() 함수를 활용해 now()(현재 시각)에서 1시간을 뺀 값으로 기존 레코드를 업데이트하는 쿼리입니다.
mysql> update DemoTable1434
-> set ArrivalDatetime=date_sub(now(),interval 1 hour);
Query OK, 3 rows affected (0.19 sec)
Rows matched: 3 Changed: 3 Warnings: 0
참고로, 이 시점의 현재 날짜와 시간은 다음과 같습니다.
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2019-09-30 21:16:48 |
+---------------------+
1 row in set (0.00 sec)
5. 업데이트 결과 확인하기
테이블을 다시 조회해 보겠습니다.
mysql> select * from DemoTable1434;
모든 레코드가 '현재 시간 − 1시간'에 해당하는 20:16:39로 변경된 것을 확인할 수 있습니다.
+---------------------+
| ArrivalDatetime |
+---------------------+
| 2019-09-30 20:16:39 |
| 2019-09-30 20:16:39 |
| 2019-09-30 20:16:39 |
+---------------------+
3 rows in set (0.00 sec)
정리 및 참고 사항
DATE_SUB(기준 날짜, INTERVAL 값 단위) 형식으로 작성하며, 위 예제처럼 interval 1 hour 외에도 DAY, MONTH, YEAR 등 다양한 단위를 사용할 수 있습니다. 또한 NOW() - INTERVAL 1 HOUR처럼 산술 연산자를 활용한 표현도 동일하게 동작하므로, 상황에 맞게 선택하여 사용하면 됩니다.