Algorithm/Programmers SQL

[MySQL] 프로그래머스 입양 시각 구하기(1)

제우제우 2024. 9. 11. 16:10

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

 

프로그래머스

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

programmers.co.kr

코딩테스트 연습 > GROUP BY > 입양 시각 구하기(1)

 

문제 분석

난이도: LEVEL2

문제 요구사항

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 

09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 

이때 결과는 시간대 순으로 정렬해야 합니다.

 

사용한 함수들 정리 

https://20240228.tistory.com/209

 

[MySQL] 자주 사용하는 함수 정리 - Updateable

목차 수학 관련 함수 ROUND()FLOOR()날짜(시간) 관련 함수 DATEDIFF()DATEFORMAT()NOW()CURDATE()CURTIME() DATE_ADD() DATE_SUB() YEAR(), MONTH(), DAY() DAYOFWEEK() DAYOFYEAR()WEEK()RELACE()문자열 관련 함수 LIKE()INSTR() REGEXP - 정규

20240228.tistory.com

 

정답 코드1(SUBSTRING, CAST)

SELECT CAST(SUBSTRING(DATETIME, 12, 2) AS SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR

 

먼저 DATETIME 년-월-일-시간-분-초 타입에서 SUBSTRING()을 사용해서 시간만 가져온다. 

해당 데이터는 01, 02, 03, ... 10, 11, 11 ... 이런 식으로 가져와진다. 

근데 쿼리 결과를 보면 01, 02 이런 형태가 아닌 1,2, ... 10, 11 형태이다. 

물론 WHEN CASE 를 사용해서 0이 붙어있으면 THEN 이런 식으로 변환이 가능하지만 

CAST(), CONVERT()를 사용해면 문자 타입을 쉽게 숫자 타입으로 바꿀 수 있다. 

 

여기서는 CAST()를 사용해서 정수형으로 변환했다. 

참고로 UNSIGNED는 양의 정수형이다. 

 

그렇게 가져온 데이터를 HOUR 별칭을 주고 

해당 HOUR를 기준으로 그룹화해준다. 

그리고 원하는 시간대가 9시 ~ 19시 여서 HAVING 조건을 추가해 주었다. 

시간대는 오름차순 정렬이니 ORDER BY 또한 HOUR를 기준으로 적용 

 

정답 코드2(SUBSTRING, CONVERT)

SELECT CONVERT(SUBSTRING(DATETIME, 12, 2),  SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR

 

정답 코드1와 동일 

바뀐점: CAST → CONVERT

 

정답 코드3(DATE_FORMAT, CONVERT)

SELECT CONVERT(DATE_FORMAT(DATETIME, '%H'), SIGNED) HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 19
ORDER BY HOUR

 

정답 코드2와 동일 

바뀐점: SUBSTRING DATE_FORMAT(DATETIME, '%H' )