Study/SQL

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

delay100 2024. 1. 12. 17:47
728x90
반응형
SMALL

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

난이도: Lv.2 

언어: MySQL

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

 

프로그래머스

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

programmers.co.kr

 

실패

없습니다.

 

성공

성공1. *채택

SELECT
    HOUR(a.DATETIME) AS HOUR
    , COUNT(a.ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS a
WHERE 1=1
AND TIME_FORMAT(TIMEDIFF('19:59', DATE_FORMAT(a.DATETIME, '%H:%i')), '%H:%i') >= '00:00'
AND TIME_FORMAT(TIMEDIFF(DATE_FORMAT(a.DATETIME, '%H:%i'), '09:00'), '%H:%i') >= '00:00'
GROUP BY HOUR
ORDER BY HOUR

문제에서 09:00~19:59 사이의 시간을 원했기 때문에, 그 시간 내에 있는 것을 정확히 명시해주고 싶었습니다.

따라서 TIME_FORMAT으로 시간, 분의 형식을 명시해주었고 TIMEDIFF으로 '시간:분'의 차이를 계산하였습니다.  

TIME_FORMAT과 TIMEDIFF에 대한 정보는 chatGPT에게서 알게 되었습니다. 더보기에 질문과 답변이 적혀있습니다.

더보기

*참고 chatGPT

질문:

MYSQL에서 '20:30'이라는 '%H:%M' 형식 데이터를 '19:59' 으로 빼서 그 차이의 값을 '%H:%M'으로 나타낼 수있는 방법?

답변:

MySQL에서 두 시간을 뺄 때는 TIMEDIFF 함수를 사용할 수 있습니다. 그러나 TIMEDIFF 함수는 결과를 시간 형식으로 반환하지 않습니다. 반환 값은 'HH:MM:SS' 형식의 문자열입니다.

두 시간을 뺀 후에 원하는 형식으로 결과를 나타내려면, TIME_FORMAT 함수를 함께 사용하여 형식을 변경할 수 있습니다.

다음은 예시입니다:

SELECT TIME_FORMAT(TIMEDIFF('20:30', '19:59'), '%H:%i') AS time_difference;

위의 쿼리에서 TIMEDIFF 함수로 두 시간의 차이를 계산하고, 그 결과를 TIME_FORMAT 함수로 '%H:%i' 형식으로 변환합니다. %H는 시간을, %i는 분을 나타냅니다.

참고로, TIMEDIFF 함수는 음수 값을 반환할 수 있습니다. 음수 값은 첫 번째 인자가 두 번째 인자보다 이전인 경우입니다. 결과를 양수로 표현하려면 ABS 함수를 사용하여 절댓값을 취할 수 있습니다:

SELECT TIME_FORMAT(ABS(TIME_TO_SEC(TIMEDIFF('20:30', '19:59'))), '%H:%i') AS time_difference;

이 쿼리에서는 TIME_TO_SEC 함수를 사용하여 시간 차이를 초 단위로 변환하고, ABS 함수로 절댓값을 취한 후 TIME_FORMAT 함수로 형식을 변경합니다.

 

성공2.

SELECT HOUR(a.DATETIME) AS HOUR, COUNT(a.ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS a
GROUP BY HOUR
HAVING HOUR >= 9 AND HOUR < 20
ORDER BY HOUR ASC

 '19:61'과 같이 입력 데이터에 오류가 있어도 통과되는 예제입니다.

HOUR을 이용해 DATE_FORMAT 대신 HOUR을 바로 뽑아오고, HAVING을 이용해 시간을 명시해주며 간단하고 직관적으로 느껴졌습니다.

더보기에 출처 남겨두었습니다. 

 

성공3.

SELECT DATE_FORMAT(a.DATETIME, '%H') AS HOUR, COUNT(a.ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS a
WHERE 1=1
AND DATE_FORMAT(a.DATETIME, '%H:%M') >= '09:00'
AND DATE_FORMAT(a.DATETIME, '%H:%M') < '20:00'
GROUP BY HOUR
ORDER BY HOUR ASC

성공1과 유사한 방법이나, '19:61'과 같이 입력 데이터에 오류가 있어도 통과되는 예제입니다.

맨 처음으로 이 방법을 채택했으나, 이상한 데이터가 DB에 적재되는 것이 마음에 들지 않아, 성공1 방법으로 변경하였습니다.

 

*참고 chatGPT

성공1에 더보기로 기재하였습니다.


코드에 질문이 있으시면 댓글을 달아주세요. 최대한 빠른 시일 내에 답변해드리겠습니다. 

봐주셔서 감사합니다.

728x90
반응형
LIST