MySQL에서 TIMEDIFF() 함수의 출력 결과를 일(DAYS), 시간(HOURS), 분(MINUTES), 초(SECONDS) 형식으로 변환하려면 CONCAT() 함수를 활용해야 합니다. 이 글에서는 실제 예제를 통해 단계별로 변환 과정을 살펴보겠습니다.
1. 샘플 테이블 생성하기
먼저 시작 시간과 종료 시간을 저장할 테이블을 만듭니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table convertTimeDifferenceDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> StartDate datetime,
-> EndDate datetime,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.68 sec)
2. 테스트 데이터 삽입하기
INSERT 문을 사용해 몇 개의 레코드를 입력합니다. 첫 두 행은 NOW()를 기준으로 각각 6시간, 4시간 차이가 나도록 설정했고, 나머지 두 행은 수개월에 걸친 긴 기간의 날짜 차이를 테스트하기 위한 것입니다.
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values(date_add(now(),interval -3 hour),date_add(now(),interval 3 hour));
Query OK, 1 row affected (0.41 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values(date_add(now(),interval -2 hour),date_add(now(),interval 2 hour));
Query OK, 1 row affected (0.27 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values('2018-04-05 12:30:35','2018-05-17 14:30:50');
Query OK, 1 row affected (0.14 sec)
mysql> insert into convertTimeDifferenceDemo(StartDate,EndDate) values('2017-10-11 11:20:30','2017-12-17 15:21:55');
Query OK, 1 row affected (0.20 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from convertTimeDifferenceDemo;
실행 결과는 다음과 같습니다.
+----+---------------------+---------------------+
| Id | StartDate | EndDate |
+----+---------------------+---------------------+
| 1 | 2019-01-28 20:55:33 | 2019-01-29 02:55:33 |
| 2 | 2019-01-28 21:57:42 | 2019-01-29 01:57:42 |
| 3 | 2018-04-05 12:30:35 | 2018-05-17 14:30:50 |
| 4 | 2017-10-11 11:20:30 | 2017-12-17 15:21:55 |
+----+---------------------+---------------------+
4 rows in set (0.00 sec)
4. TIMEDIFF 결과를 일·시·분 형식으로 변환하기
이제 핵심인 변환 쿼리입니다. FLOOR(), MOD(), CONCAT() 함수를 조합하면 두 날짜 사이의 시간 차이를 사람이 읽기 쉬운 형태로 바꿀 수 있습니다.
mysql> SELECT CONCAT(
-> FLOOR(HOUR(TIMEDIFF(StartDate,EndDate)) / 24), ' DAYS ',
-> MOD(HOUR(TIMEDIFF(StartDate,EndDate)), 24), ' HOURS ',
-> MINUTE(TIMEDIFF(StartDate,EndDate)), ' MINUTES ') AS DESCRIPTION
-> FROM convertTimeDifferenceDemo;
실행 결과는 다음과 같습니다.
+------------------------------+
| DESCRIPTION |
+------------------------------+
| 0 DAYS 6 HOURS 0 MINUTES |
| 0 DAYS 4 HOURS 0 MINUTES |
| 34 DAYS 22 HOURS 59 MINUTES |
| 34 DAYS 22 HOURS 59 MINUTES |
+------------------------------+
4 rows in set, 6 warnings (0.04 sec)
쿼리 동작 원리
- FLOOR(HOUR(TIMEDIFF(...)) / 24) : 총 시간을 24로 나누어 ‘일’ 단위를 계산합니다.
- MOD(HOUR(TIMEDIFF(...)), 24) : 24로 나눈 나머지를 구해 남은 ‘시간’을 계산합니다.
- MINUTE(TIMEDIFF(...)) : ‘분’ 값을 그대로 추출합니다.
- CONCAT() : 각 값과 단위 문자열을 하나로 연결해 가독성 있는 결과를 만듭니다.
초(SECONDS)까지 표시하고 싶다면?
초 단위까지 포함하고 싶다면 SECOND() 함수를 CONCAT에 추가하면 됩니다. 단위를 한글로 바꾸면 더욱 직관적인 출력이 가능합니다.
SELECT CONCAT(
FLOOR(HOUR(TIMEDIFF(StartDate,EndDate)) / 24), '일 ',
MOD(HOUR(TIMEDIFF(StartDate,EndDate)), 24), '시간 ',
MINUTE(TIMEDIFF(StartDate,EndDate)), '분 ',
SECOND(TIMEDIFF(StartDate,EndDate)), '초') AS 소요시간
FROM convertTimeDifferenceDemo;
이처럼 MySQL의 내장 함수만 적절히 조합하면 별도의 애플리케이션 로직 없이도 SQL 쿼리 안에서 시간 차이를 원하는 형식으로 손쉽게 변환할 수 있습니다.