[ORACLE] 프로그래머스 입양 시각 구하기(1) (+MySQL)
2021. 3. 11.
반응형

programmers.co.kr/learn/courses/30/lessons/59412

 

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

ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물

programmers.co.kr

 

1. 서론

 

이 문제 솔직히 좀 복잡하고 어려웠다 ㅎ (쿼리 자체가 아니라 처음 쓰는 개념들 때문에)

 

2. 문제 풀이

 

ANIMAL_OUTS: 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블

테이블 구조:

ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME

(각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부)

 

Q. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.

 

문제의 키 포인트

 

1. 9~ 19시 사이 시간제한

2. 시간대 별 입양 total

3. 시간대 순 정렬

 

여기서 문제는 datetime이다. datetime의 데이터 형식을 분해해야 한다. datetime은 시스템에서 date를 그냥 생성한 형태라서 문자열에다가 년, 월, 시, 분, 초가 전부 적혀있다. 여기서 유의미한 데이터인 시간만 뽑아서 써야 한다.

 

날짜 타입 참조: nown2210.tistory.com/92

 

[오라클|Oracle] 날짜타입 가지고 놀기 - TO_DATE, TO_CHAR

 오라클 Oracle 날짜타입 가지고 놀기 쿼리를 수행하다 보면, 날짜와 관련된 정보를 조회하거나 변경해야 하는 경우가 상당히 많습니다. 오늘은 이런 경우 날짜 타입에 대한 사용법 몇 가지를

nown2210.tistory.com

to_char() 함수를 사용하면 원하는 값을 분리해서 사용할 수 있는데 이 경우에는 24시간제이므로 HH24를 썼지만 이외에도 YYYY, YY, MM(월), MI(분), HH24, HH12 등 다양하다.

(년 YYYY, 월 MM, 일 DD, 시 HH24, 분 MI, 초 SS)

 

시간은 저렇게 분리하고, 시간제한은 조건이 걸려있기 때문에 조건문을 사용해야 하는데 이때 시간과 그 횟수를 같이 조회해야 하기 때문에 group by를 쓰므로 having을 사용해 조건을 걸어야 한다. 그리고 order by를 사용해 시간대 순으로 정렬해준다.

 

3. 코드 설명

 

SELECT to_char(datetime, 'HH24') HOUR, count (to_char(datetime, 'HH24')) COUNT
FROM animal_outs
GROUP BY to_char(datetime, 'HH24')
HAVING to_char(datetime, 'HH24') >= 9 and to_char(datetime, 'HH24') <= 19
ORDER BY to_char(datetime, 'HH24');

 

to_char로 시간을 구해준다. 그리고 그걸 count 한다. count 했기 때문에 group by도 한다.

문제에 9시부터 19시까지라고 적혀있었기 때문에 having절에서 처리해준다.

시간대 순으로 정렬해야 하기에 order by를 썼다.

그런데 보면 to_char ~~ 가 너무 긴데 계속 반복해서 나오는 게 너무 꼴 보기가 싫다. 따로 변수로 만들어서 쓰고 싶었으나 어찌하는지 몰라 그냥 무식하게 풀었는데 이런 코드를 발견했다.

 

SELECT hour, count(*)
FROM 
    (SELECT TO_CHAR(datetime,'HH24') AS hour
     FROM animal_outs)
WHERE hour BETWEEN 09 AND 19
GROUP BY hour
ORDER BY hour;

 

서브 쿼리를 써서 to_char 부분을 따로 변수로 쓰는 것이다... 솔직히 배운 지 너무 오래돼서 서브 쿼리 where에서만 써봄...

이렇게도 쓸 수 있다니 신기하다. 그리고 까먹고 있었던 BETWEEN까지... 이 분은 프로다.

 

 

+MySQL

 

SELECT date_format(datetime, '%H') as hour, count(*)
FROM animal_outs
WHERE date_format(datetime, '%H') >= 9 and date_format(datetime, '%H') <= 20 
GROUP BY hour
ORDER BY hour;

 

MySQL 공부할 일 있어서 작성했다.

to_char도 어떻게 하는지 까먹어서 인터넷에 쳐봤는데 MySQL에서는 date_format이란다... 진짜 통일 좀 해라 

 

About date_format

https://atoz-develop.tistory.com/entry/Oracle의-TOCHAR-함수와-대응되는-MySQL-함수

 

Oracle의 TO_CHAR 함수와 대응되는 MySQL 함수

Oracle TO_CHAR -> MySQL DATE_FORMAT Oracle의 TO_CHAR는 MySQL의 DATE_FORMAT과 대응된다. ℹ️ Oracle TO_CHAR 사용 예 select TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS') from dual 20201206153514 ℹ️ MySQL DAT..

atoz-develop.tistory.com

 

 

 

 

반응형
myoskin