입양 시각 구하기(1)
https://school.programmers.co.kr/learn/courses/30/lessons/59412
문제 풀이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SELECT HOUR, COUNT(HOUR) AS COUNT FROM ( SELECT EXTRACT(HOUR FROM CAST(DATETIME AS TIMESTAMP)) AS HOUR FROM ANIMAL_OUTS ) GROUP BY HOUR HAVING HOUR BETWEEN 9 AND 19 ORDER BY HOUR;
ANIMAL_OUTS
테이블에서DATETIME
열에서 시간을 추출하여 그 값을TIMESTAMP
형태로 변환한다. 이 때,EXTRACT(HOUR FROM ...)
함수를 사용하여 시간을 추출한다.EXTRACT
및CAST
사용 이유:EXTRACT
함수를 사용하여DATETIME
에서 시간을 추출한다.CAST
함수를 사용하여DATETIME
을TIMESTAMP
로 변환한다.- 이렇게 하는 이유는 DBMS에 따라
DATETIME
에서 직접 시간을 추출할 수 없거나, 혹은 정확한 결과를 얻기 위해서이다.TIMESTAMP
로 캐스팅하면 시간 관련 함수를 적용할 때 더 정확한 결과를 얻을 수 있다.
- 추출된 시간이 0에서 시작하지 않는 이유:
EXTRACT(HOUR FROM ...)
으로 시간을 추출하면 결과가 0부터 시작하는 것이 아니라, 1부터 시작한다. 따라서07
이라면 7이라고 나오는 것은 정상적인 동작이다.
- 추출된 시간을
HOUR
이라는 이름으로 선택하고, 이를 바탕으로 그룹화한다. - 그룹화된 결과에서 시간이 9부터 19 사이인 것들만 필터링한다.
- 각 시간대별로 발생한 동물 입양 건수를 세고, 그 결과를
COUNT
열로 표시한다. - 시간대별로 정렬하여 결과를 반환한다.
1 2 3 4 5
SELECT TO_NUMBER(TO_CHAR(DATETIME, 'HH24')) AS "HOUR", COUNT(*) AS "COUNT" FROM ANIMAL_OUTS WHERE TO_CHAR(DATETIME, 'HH24') >= '09' AND TO_CHAR(DATETIME, 'HH24') < '20' GROUP BY TO_CHAR(DATETIME, 'HH24') ORDER BY HOUR;
- 기본적으로 숫자로 인식하기 위해서는 앞에 나오는 0이 의미가 없기 때문에 자동으로 무시된다. 이런 현상은 숫자로 변환하는 과정에서 주로 발생하며, 주로
TO_NUMBER
함수와 같은 함수를 사용하여 처리한다.
1 2 3 4 5
SELECT TO_CHAR(DATETIME, 'FMHH24') AS HOUR, COUNT(*) AS "COUNT" FROM ANIMAL_OUTS GROUP BY TO_CHAR(DATETIME, 'FMHH24') HAVING TO_CHAR(DATETIME, 'FMHH24') BETWEEN 9 AND 19 ORDER BY TO_NUMBER(HOUR) ASC;
BETWEEN '9' AND '19'
- 문자열 비교는 각 문자의 아스키 코드 값으로 이루어진다. 따라서 ‘10’과 ‘9’를 문자열로 비교하면 첫 번째 문자부터 비교하게 된다.
- 첫 번째 문자: ‘1’과 ‘9’ 비교
- ‘1’의 아스키 코드는 49
- ‘9’의 아스키 코드는 57
- 따라서 ‘1’이 더 작다고 판단되어 ‘10’이 ‘9’보다 작다고 표시된다.
- 첫 번째 문자: ‘1’과 ‘9’ 비교
- 문자열 비교는 각 문자의 아스키 코드 값으로 이루어진다. 따라서 ‘10’과 ‘9’를 문자열로 비교하면 첫 번째 문자부터 비교하게 된다.
- 날짜 및 시간 포맷 지정자
TO_CHAR(DATETIME, 'HH24')
은 24시간 형식으로 시간을 나타내고,TO_CHAR(DATETIME, 'HH')
는 12시간 형식으로 시간을 나타낸다.- HH (12-hour clock)
HH
는 12시간 형식의 시간을 나타낸다.- 01부터 12까지의 값을 가진다.
- 오전(AM) 또는 오후(PM)를 나타내기 위해 AM 또는 PM을 사용한다.
09:30 AM
,04:45 PM
HH24
는 24시간 형식의 시간을 나타낸다.- 00부터 23까지의 값을 가진다.
- 오전과 오후의 구분이 없다.
09:30
,16:45
- 숫자나 날짜를 형식화할 때 공백을 제거하는 서식 요소이다.
- 여백이 제거되면서 숫자의 경우 왼쪽으로 정렬되고, 문자열의 경우 앞뒤 공백이 제거된다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.