모 시험에서 시간 차이를 계산하는 문제가 나왔다. 이전에 SQL로 시간을 다루는 문제를 풀어본 적이 없어서 해당 문제는 풀지 못했다. 프로그래머스에 시간을 계산하는 비슷한 문제가 있어서 제시한다.
https://school.programmers.co.kr/learn/courses/30/lessons/59411
입양 간 동물들을 보호한 시간 (나간 시간 - 들어온 시간)을 기준으로 내림차순 정렬하는 문제다. 시간을 계산하는 함수만 알고 있다면 정말 쉽게 풀리지만, 모르면 못푼다.
이때, 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;
'CS > 알고리즘&문제풀이' 카테고리의 다른 글
[백준] 2292 벌집 수학적 풀이 (0) | 2024.05.07 |
---|---|
[프로그래머스] 숫자 변환하기 (0) | 2023.07.28 |
[프로그래머스] 방문 길이 (0) | 2023.07.23 |
[백준] 4948, 베르트랑 공준 (0) | 2023.07.04 |
[프로그래머스] 마법의 엘리베이터 (1) | 2023.05.11 |