프로그래머스 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()
사용이 적합.