포스트

입양 시각 구하기(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;
    
    1. ANIMAL_OUTS 테이블에서 DATETIME 열에서 시간을 추출하여 그 값을 TIMESTAMP 형태로 변환한다. 이 때, EXTRACT(HOUR FROM ...) 함수를 사용하여 시간을 추출한다.
      • EXTRACTCAST 사용 이유:
        • EXTRACT 함수를 사용하여 DATETIME에서 시간을 추출한다.
        • CAST 함수를 사용하여 DATETIMETIMESTAMP로 변환한다.
        • 이렇게 하는 이유는 DBMS에 따라 DATETIME에서 직접 시간을 추출할 수 없거나, 혹은 정확한 결과를 얻기 위해서이다. TIMESTAMP로 캐스팅하면 시간 관련 함수를 적용할 때 더 정확한 결과를 얻을 수 있다.
      • 추출된 시간이 0에서 시작하지 않는 이유:
        • EXTRACT(HOUR FROM ...)으로 시간을 추출하면 결과가 0부터 시작하는 것이 아니라, 1부터 시작한다. 따라서 07이라면 7이라고 나오는 것은 정상적인 동작이다.
    2. 추출된 시간을 HOUR이라는 이름으로 선택하고, 이를 바탕으로 그룹화한다.
    3. 그룹화된 결과에서 시간이 9부터 19 사이인 것들만 필터링한다.
    4. 각 시간대별로 발생한 동물 입양 건수를 세고, 그 결과를 COUNT 열로 표시한다.
    5. 시간대별로 정렬하여 결과를 반환한다.


    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’보다 작다고 표시된다.


  • 날짜 및 시간 포맷 지정자
    • TO_CHAR(DATETIME, 'HH24')은 24시간 형식으로 시간을 나타내고, TO_CHAR(DATETIME, 'HH')는 12시간 형식으로 시간을 나타낸다.
      1. HH (12-hour clock)
      • HH는 12시간 형식의 시간을 나타낸다.
      • 01부터 12까지의 값을 가진다.
      • 오전(AM) 또는 오후(PM)를 나타내기 위해 AM 또는 PM을 사용한다.
      • 09:30 AM, 04:45 PM

      실행 결과

      2. HH24 (24-hour clock)

      • HH24는 24시간 형식의 시간을 나타낸다.
      • 00부터 23까지의 값을 가진다.
      • 오전과 오후의 구분이 없다.
      • 09:30, 16:45

      실행 결과

      3. FM(fill mode)

      • 숫자나 날짜를 형식화할 때 공백을 제거하는 서식 요소이다.
      • 여백이 제거되면서 숫자의 경우 왼쪽으로 정렬되고, 문자열의 경우 앞뒤 공백이 제거된다.


  • 실행 결과 실행 결과 실행 결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.