MySQL에서 두 타임스탬프(TIMESTAMP) 사이의 차이를 초 단위로 구하려면 내장 함수인 UNIX_TIMESTAMP()를 활용하면 됩니다. 이 함수는 날짜·시간 값을 유닉스 타임스탬프(초 단위 정수)로 변환해 주기 때문에, 두 값을 빼기만 하면 손쉽게 초 단위 차이를 계산할 수 있습니다.
기본 문법
SELECT UNIX_TIMESTAMP(컬럼명1) - UNIX_TIMESTAMP(컬럼명2) AS 별칭 FROM 테이블명;
그럼 실제 예제를 통해 개념을 살펴보겠습니다. 먼저 테스트용 테이블을 생성합니다.
1. 테이블 생성
mysql> create table DifferenceInSeconds -> ( -> FirstTimestamp TIMESTAMP, -> SecondTimestamp TIMESTAMP -> ); Query OK, 0 rows affected (0.93 sec)
2. 데이터 삽입
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DifferenceInSeconds values('2012-12-12 13:16:55','2012-12-12 13:13:55');
Query OK, 1 row affected (0.31 sec)
mysql> insert into DifferenceInSeconds values('2014-10-11 12:15:50','2014-10-11 12:13:50');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DifferenceInSeconds values('2018-12-14 13:30:53','2018-12-14 13:27:53');
Query OK, 1 row affected (0.21 sec)3. 저장된 데이터 확인
SELECT 문으로 테이블의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DifferenceInSeconds;
실행 결과는 다음과 같습니다.
+---------------------+---------------------+ | FirstTimestamp | SecondTimestamp | +---------------------+---------------------+ | 2012-12-12 13:16:55 | 2012-12-12 13:13:55 | | 2014-10-11 12:15:50 | 2014-10-11 12:13:50 | | 2018-12-14 13:30:53 | 2018-12-14 13:27:53 | +---------------------+---------------------+ 3 rows in set (0.00 sec)
두 타임스탬프의 초 단위 차이 구하기
이제 UNIX_TIMESTAMP() 함수를 사용해 두 타임스탬프 간의 차이를 초 단위로 계산하는 쿼리를 실행해 보겠습니다.
mysql> SELECT UNIX_TIMESTAMP(FirstTimestamp) - UNIX_TIMESTAMP(SecondTimestamp) as Seconds from DifferenceInSeconds;
결과는 다음과 같습니다.
+---------+ | Seconds | +---------+ | 180 | | 120 | | 180 | +---------+ 3 rows in set (0.00 sec)
첫 번째 행은 180초(3분), 두 번째 행은 120초(2분) 차이가 나는 것을 확인할 수 있습니다.
ABS() 함수로 항상 양수 결과 얻기
참고: 어느 쪽 타임스탬프가 더 큰지 알 수 없는 경우에는 ABS() 함수를 함께 사용하는 것이 좋습니다. ABS()는 절댓값을 반환하기 때문에 두 값의 순서와 관계없이 항상 양수인 차이를 얻을 수 있습니다.
문법은 다음과 같습니다.
SELECT ABS(UNIX_TIMESTAMP(컬럼명1) - UNIX_TIMESTAMP(컬럼명2)) AS Seconds FROM 테이블명;
ABS() 동작 검증하기
위 문법을 확인하기 위해 첫 번째 타임스탬프가 더 작은 값을 가진 레코드를 하나 추가해 보겠습니다.
mysql> insert into DifferenceInSeconds values('2018-12-14 13:26:53','2018-12-14 13:31:53');
Query OK, 1 row affected (0.21 sec)테이블의 전체 레코드를 다시 조회합니다.
mysql> select *from DifferenceInSeconds;
실행 결과입니다.
+---------------------+---------------------+ | FirstTimestamp | SecondTimestamp | +---------------------+---------------------+ | 2012-12-12 13:16:55 | 2012-12-12 13:13:55 | | 2014-10-11 12:15:50 | 2014-10-11 12:13:50 | | 2018-12-14 13:30:53 | 2018-12-14 13:27:53 | | 2018-12-14 13:26:53 | 2018-12-14 13:31:53 | +---------------------+---------------------+ 4 rows in set (0.00 sec)
이제 ABS() 함수를 적용한 쿼리를 실행해 보겠습니다.
mysql> SELECT ABS(UNIX_TIMESTAMP(FirstTimestamp) - UNIX_TIMESTAMP(SecondTimestamp)) as Seconds from DifferenceInSeconds;
실행 결과는 다음과 같습니다.
+---------+ | Seconds | +---------+ | 180 | | 120 | | 180 | | 300 | +---------+ 4 rows in set (0.00 sec)
참고: 만약 ABS() 함수를 사용하지 않았다면 마지막 행의 결과는 -300초로 출력되었을 것입니다. 이처럼 두 타임스탬프의 대소 관계를 확신할 수 없다면 ABS()를 사용하는 것이 안전합니다.