본문 바로가기
SQL/코딩테스트

[프로그래머스 / MySQL] 자동차 대여 기록에서 장기/단기 대여 구분하기

by Hi_heidi 2024. 2. 1.

문제

💡 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

 

테이블 형태

테이블 / 출력 결과 예시

 

풀이

SELECT  HISTORY_ID 
        , CAR_ID
        , DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE
        , DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE
        , CASE WHEN DATEDIFF(END_DATE,START_DATE) + 1 >= 30 THEN "장기 대여"
        ELSE "단기 대여" END AS RENT_TYPE
 FROM  CAR_RENTAL_COMPANY_RENTAL_HISTORY
 WHERE  START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
 ORDER BY  HISTORY_ID DESC

 

해설

FROM  CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE  START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
  • 대여 기간에 따라 장기대여/단기대여로 구분하여 컬럼을 생성하는 것이 핵심이다
  • 먼저 WHERE문에 BETWEEN AND를 사용해 대여 시작일이 22년 9월 1일과 9월 30일에 포함되는 데이터를 필터링한다
SELECT  HISTORY_ID 
        , CAR_ID
        , DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE
        , DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE
        , CASE WHEN DATEDIFF(END_DATE,START_DATE) + 1 >= 30 THEN "장기 대여"
        ELSE "단기 대여" END AS RENT_TYPE
  • SELECT문에 출력 컬럼을 지정한다
  • START_DATE 와 END_DATE 는 DATE타입이어서 시:분:초까지 출력되므로 DATE_FORMAT을 활용해 ‘4자리 연도-두자리 월-두 자리 일(YYYY-mm-dd)’의 포맷을 지정한다CASE문을 사용해 총 대여일(=대여 종료일 - 대여 시작일 +1)이 30보다 크거나 같을 경우 '장기 대여'로, 그 외의 경우 '단기 대여'의 값을 부여하는 RENT_TYPE 컬럼을 생성한다. 이때 DATETIFF 는 (END DATE, START DATE) 순서를 지켜줘야 한다
CASE문
용례1) CASE 컬럼명 WHEN ...
CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ... # 생략 가능
    [ELSE statement_list] # 생략 가능
END

용례2) CASE WHEN 조건...
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ... # 생략 가능
    [ELSE statement_list] # 생략 가능
END

- ELSE를 생략할 경우 ELSE NULL이 자동으로 지정된다
- WHEN절의 조건에 부합하지 않는 데이터는 ELSE에서 지정한 값으로 반환되며, ELSE에 값을 지정해주지 않았을 경우 자동으로 NULL이 반환된다

 

 DATEDIFF(expr1, expr2)
mysql> SELECT DATEDIFF('2007-12-31 23:59:59','2007-12-30')
        -> 1
mysql> SELECT DATEDIFF('2010-11-30 23:59:59','2010-12-31')
        -> -31

- DATEDIFF는 expr1-expr2값을 반환한다
- 시간이 포함된 값을 넣어도 시간의 차이는 계산되지 않으며, 오직 날짜의 차이만 계산한다

DATE_FORMAT(date, format)
날짜 포맷에서 사용할 수 있는 형식 지정자 종류

ORDER BY  HISTORY_ID DESC
  • 대여 기록 ID를 기준으로 내림차순 정렬한다