본문 바로가기

CS/알고리즘&문제풀이

[프로그래머스 SQL] 오랜 기간 보호한 동물(2) / TIMESTAMPDIFF / TO_SECONDS

모 시험에서 시간 차이를 계산하는 문제가 나왔다. 이전에 SQL로 시간을 다루는 문제를 풀어본 적이 없어서 해당 문제는 풀지 못했다. 프로그래머스에 시간을 계산하는 비슷한 문제가 있어서 제시한다.

https://school.programmers.co.kr/learn/courses/30/lessons/59411

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 입양 간 동물들을 보호한 시간 (나간 시간 - 들어온 시간)을 기준으로 내림차순 정렬하는 문제다. 시간을 계산하는 함수만 알고 있다면 정말 쉽게 풀리지만, 모르면 못푼다.

이때, MYSQL에서 시간 관련 타입은 다음과 같은 것들이 있다.

  • TIME: 시간 ( HH:MM:SS ) 을 표현
  • DATE: 날짜 ( YYYY-MM-DD ) 을 표현
  • DATETIME: 시간 + 날짜 정보 표현. '1000-01-01 00:00:00'부터 '9999-12-31 23:59:59' 범위
  • TIMESTAMP: 시간 + 날짜 정보 표현. UNIX TIMESTAMP, '1970-01-01 00:00:01'부터 '2038-01-19 03:14:07' 범위

TIMESTAMP는 32비트인 UNIX TIMESTAMP로 저장되기 때문에, '2038-01-19 03:14:07' 이후에는 오버플로우가 발생할 수 있다고 한다.

두 시각의 차이를 계산하는 방법은 여러가지가 있다.

TIMESTAMPDIFF(unit, datetime1, datetime2)

두 DATETIME의 시간차이 datetime2 - datetime1 를 unit에 들어가는 타입을 기준으로 반환한다.

  • unit: 기준. SECOND / MINUTE / HOUR / DAY / MONTH / YEAR 등이 존재
  • datetime1: 시작 시간
  • datetime2: 끝 시간

TIMESTAMPDIFF을 사용하면 다음과 같이 풀 수 있다.

SELECT I.ANIMAL_ID, I.NAME FROM ANIMAL_INS I 
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY TIMESTAMPDIFF(SECOND, I.DATETIME,O.DATETIME) DESC
LIMIT 2;

TO_SECONDS(expr)

0년을 기준으로 expr(date / datetime)까지 흐른 시간을 초로 반환한다.

두 시각을 TO_SECONDS로 초 단위로 바꾸고, 두 값을 빼면 시간 차이를 초 단위로 구할 수 있다.

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I 
JOIN ANIMAL_OUTS O ON I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY TIMESTAMPDIFF(SECOND, I.DATETIME,O.DATETIME) DESC
LIMIT 2;