https://school.programmers.co.kr/learn/courses/30/lessons/59412
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드설명
HOUR 을 사용합니다.
문제에서 유의해야할점은,
WHERE절에는 ALIAS 를 사용할 수 없다는 것 입니다.
WHERE 절은 데이터베이스 엔진이 데이터를 필터링할 때 사용되는데, 이 단계에서는 SELECT 절의 별칭이 아직 적용되지 않습니다.
그렇기에 직접 HOUR(DATETIME)을 적용합니다.
또, 저 같은경우 && 논리연산자를 통하여 진행했는데, 아래와 같이 여러방식으로 가능합니다.
WHERE HOUR(DATETIME) >=9 && HOUR(DATETIME) <=19
WHERE HOUR(DATETIME) >=9 AND HOUR(DATETIME) <=19
WHERE HOUR(DATETIME) BETWEEN 9 AND 19
또, 중요한점은, '%H' 를 사용하여야 합니다.
- '%H':
- 24시간 형식으로 시간을 표시합니다.
- 00부터 23까지의 값을 사용합니다.
- 한 자리 숫자일 경우 앞에 0을 붙입니다 (예: 01, 02, ..., 23).
- '%h':
- 12시간 형식으로 시간을 표시합니다.
- 01부터 12까지의 값을 사용합니다.
- 한 자리 숫자일 경우 앞에 0을 붙입니다 (예: 01, 02, ..., 12).
- AM/PM을 구분하려면 별도로 '%p'를 사용해야 합니다.
또한, 헷갈리면 안되는 점은 GROUP BY 뒤에 WHERE 절이 직접 들어갈 수 없습니다.
즉, 항상 GROUP BY 절 앞에 WHERE절이 들어가서 먼저 필터링한 후 GROUP BY 를 한다고 생각해야 합니다.
SQL 쿼리의 일반적인 구조는 다음과 같습니다
SELECT 열_목록
FROM 테이블
WHERE 조건
GROUP BY 그룹화_기준
HAVING 그룹_조건
ORDER BY 정렬_기준
문제에서 원하는 타입은 "8" 이라고 생각헀지만 08이 들어가더라도 자동으로 문자열이 정수형으로 바뀌며 연산이 가능합니다.
코드
-- 코드를 입력하세요
# SELECT DATE_FORMAT(DATETIME,'%H') AS HOUR
SELECT HOUR(DATETIME) AS HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >=9 AND HOUR(DATETIME) <=19
GROUP BY HOUR
ORDER BY HOUR ASC;
%H가 아닌 %H라고 사용해야한다는 점을 유의합니다.
SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AS AO
GROUP BY HOUR
HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR ASC
아래와 거의 같으나, WHERE 절로 필터링합니다.
SELECT DATE_FORMAT(DATETIME, '%H') AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AS AO
WHERE DATE_FORMAT(DATETIME, '%H') BETWEEN 9 AND 20
GROUP BY HOUR
# HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR ASC
ORACLE
가장 단순한 코드입니다. WHERE 절에서 먼저 시간을 필터링하고, 나머지 작업을 수행합니다.
SELECT TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24')) AS HOUR, COUNT(*)
FROM ANIMAL_OUTS AO
WHERE TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24')) BETWEEN 9 AND 20
GROUP BY TO_NUMBER(TO_CHAR(AO.DATETIME, 'HH24'))
ORDER BY HOUR ASC
만약 아래와 같이 푼다면, WITH 구문으로 임시테이블을 만들어서 처리하므로 밖의 쿼리에서 HOUR을 토대로 손쉽게 WHERE 절과 SELECT문이 깔금해집니다.
WITH TIME_DATA AS (
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR
FROM ANIMAL_OUTS
)
SELECT HOUR, COUNT(*)
FROM TIME_DATA
WHERE HOUR BETWEEN 9 AND 20
GROUP BY HOUR
ORDER BY HOUR ASC
즉, 이렇게 사용한것과 같습니다.
SELECT HOUR, COUNT(*)
FROM (
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS HOUR
FROM ANIMAL_OUTS AO
)
GROUP BY HOUR
ORDER BY HOUR ASC
이렇게 서브쿼리에서 먼저 시간을 모두 추출하고, 메인쿼리에서 이 추출된 결과를 그룹화 및 집계한다면, 가독성측면에서는 유리합니다.