프로그래머스 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
처음에 작성했던 쿼리는 다음과 같다.
SELECT DATE_FORMAT(DATETIME, %i) AS HOUR,
COUNT(*)
FROM ANIMAL_OUTS
WHERE 9 < DATE_FORMAT(DATETIME, %i) < 19
GROUP BY DATE_FORMAT(DATETIME, %i)
ORDER BY HOUR

다음과 같은 결과값이 나와서 당황했다.. ㅋ
생각해보니 %i는 분을 의미하는 것을 실수했다.
이참에 DATE_TIME에 관한 내용을 정리하고자 한다.
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() 사용이 적합.