프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT HOUR(DATETIME) AS HOUR,
COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR
JOIN
에 적응이 되어가길래 오랜만에 GROUP BY
문제를 풀어보았다.
LEVEL2 임에도 불구하고 또 오랜만에 GROUP BY
를 풀어보니 어렵네...? ㅠㅠ
처음에 작성했던 쿼리는 다음과 같다.
SELECT DATE_FORMAT(DATETIME, '%i') AS HOUR,
COUNT(*)
FROM ANIMAL_OUTS
GROUP BY DATE_FORMAT(DATETIME, '%i')
ORDER BY HOUR
어.. 근데 왜 HOUR에 59까지 있지 ??? 뭐가 잘못된거지 ??????
확인해본 결과 DATE_FORMAT
에 %i
로 옵션을 줬기 때문에 분 단위로 GROUP BY
를 진행한 것이었다.
이참에 DATE
에 관한 내용을 정리해보려고 한다.
YEAR(DATETIME)
→ 연도만 뽑기 (예: 2025)
MONTH(DATETIME)
→ 월만 뽑기 (예: 8)
DAY(DATETIME)
→ 일(day)만 뽑기 (예: 16)
HOUR(DATETIME)
→ 시(hour)만 뽑기 (예: 0~23)
MINUTE(DATETIME)
→ 분(minute)만 뽑기 (0~59)
SECOND(DATETIME)
→ 초(second)만 뽑기 (0~59)
DATE(DATETIME)
→ 날짜(yyyy-mm-dd)만 뽑기
DATEDIFF(d1, d2)
→ 두 날짜 차이(일 단위)
TIMESTAMPDIFF(unit, d1, d2)
→ 두 시점 차이 (연, 월, 일, 시, 분 등 단위 지정)
DATE_FORMAT(DATETIME, '%Y-%m-%d %H:%i:%s')
→ 문자열 포맷으로 바꿔줌
%Y
= 연도(4자리), %m
= 월, %d
= 일
%H
= 시(0023), %i
= 분(0059), %s
= 초(00~59)
숫자 집계/정렬 목적 → HOUR()
, MINUTE()
같은 함수 사용
출력 포맷 맞추기 목적 → DATE_FORMAT()
사용.