[프로그래머스] LEVEL1 자동차 대여 기록에서 장기/단기 대여 구분하기
문제에서 SELECT를 이용하여 조회해야 하는 컬럼은 기존 테이블에 있는 컬럼인 HISTORY_ID, CAR_ID, START_DATE, END_DATE 4가지와 대여기간에 따라 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여'로 표시할 추가될 컬럼 RENT_TYPE 1가지까지 총 5가지입니다.
따라서, 핵심은 RENT_TYPE을 어떻게 추가하여 조회할 것인가인데, 조건에 따라 데이터를 처리하기 위해서 CASE 구문을 사용하여 문제를 해결하였습니다.
쿼리를 만들기 전에 해야 할 것들을 정리하면,
- SELECT 할 컬럼 정하기(HISTORY_ID, CAR_ID, START_DATE, END_DATE, RENT_TYPE)
- 조건에 따라 RENT_TYPE 컬럼의 데이터가 바뀌므로 CASE-WHEN-THEN-ELSE 구문 이용하기
- 추출할 테이블은 CAR_RENTAL_COMPANY_RENTAL_HISTORY, 대여 시작일(START_DATE)은 2022년 9월의 데이터
- 정렬 순서는 대여기록 ID(HISTORY_ID) 내림차순, 출력할 데이터 포맷은 DATE_FORMAT 이용하기
CASE 컬럼
WHEN 조건1 THEN 데이터1
WHEN 조건2 THEN 데이터2
ELSE 데이터3
END
컬럼이 조건 1일 때는 데이터 1, 조건 2일 때는 데이터 3, 모두 아닌 경우에는 데이터 3을 출력하는 구문입니다. 해당 문제에서는 RENT_TYPE이 신규로 추가해야 하는 컬럼이기 때문에 SELECT문에서 CASE 구문을 바로 사용하여 AS로 RENT_TYPE 컬럼을 출력하였습니다.
DATEDIFF('2023-07-31', '2023-07-01') + 1
DATEDIFF() 함수는 날짜 간의 일 수 차이를 계산해 주는 함수로, 날짜1 - 날짜2의 값을 계산해 주므로 START_DATE와 END_DATE의 순서를 헷갈리지 않도록 주의해야 합니다. 위 문제에서는 END_DATE, START_DATE 순으로 나와야 차이 일수가 양수로 나온다. 또한 2023-07-31에서 2023-07-01까지의 날은 31일 차이지만 DATEDIFF()로 계산하면 30이 나오기 때문에 1을 더하였습니다.
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(dd, START_DATE, END_DATE) + 1 < 30 THEN '단기 대여'
ELSE '장기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE like '2022-09-%'
ORDER BY HISTORY_ID DESC