CODING TEST/MySQL

Lv1 - 자동차 대여 기록에서 장기/단기 대여 구분하기

iamyuunzo 2025. 7. 17. 11:41

📌 문제 정보

- 문제 이름 : 프로그래머스 - (String, Date) 자동차 대여 기록에서 장기/단기 대여 구분하기

- 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

 

 

📌 문제 요약

- CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블 : HISTORY_ID(자동차 대여 기록 ID), CAR_ID(자동차 ID), START_DATE(대여 시작일), END_DATE(대여 종료일)

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

(START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리 됨.)

 

예시)

HISTORY_ID  CAR_ID  START_DATE  END_DATE
1 4 2022-09-27 2022-11-27
2 3 2022-10-03 2022-11-04
3 2 2022-09-05 2022-09-05
4 1 2022-09-01 2022-09-30
5 3 2022-09-16 2022-10-15

 

출력)

2022년 9월의 대여 기록 중 '장기 대여' 에 해당하는 기록은 대여 기록 ID가 1, 4인 기록이고, '단기 대여' 에 해당하는 기록은 대여 기록 ID가 3, 5 인 기록이므로 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

HISTORY_ID  CAR_ID  START_DATE  END_DATE RENT_TYPE
5 3 2022-09-16 2022-10-13 단기 대여
4 1 2022-09-01 2022-09-30 장기 대여
3 2 2022-09-05 2022-09-05 단기 대여
1 4 2022-09-27 2022-10-26 장기 대여

 

 

 

 

📌 내 풀이 및 코드

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;

- 자동차 대여 기록 중 2022년 9월 시작한 대여 기록에 대해 대여 기간이 30일 이상이면 '장기 대여', 아니면 '단기 대여'로 구분하여 출력 (CASE WHEN으로 장/단기 구분)+ 대여 시작일이 2022년 9월인 데이터만 필터링 (BETWEEN으로 9월 한 달 조건 설정)

 

 

 

 

📌 새로 배운 문법

<-- 이번 문제에서 새로 배운 Java 문법 정리 -->

** CASE 문 **

- IF문처럼 조건을 검사해서 맞는 경우에 해당 값을 리턴 (ELSE 생략 가능하지만, 보통은 예외 처리를 위해 씀)

- CASE는 SELECT, WHERE, ORDER BY 등 다양한 곳에 사용 가능함.

# 기본 문법
CASE
    WHEN 조건1 THEN 결과1
    WHEN 조건2 THEN 결과2
    ...
    ELSE 기본값
END


# 예제 : 나이에 따른 분류
-- 철수가 70, 영희가 20, 민수가 17 일 때 AGE_GROUP에 각각 어떻게 표시?
SELECT 
    NAME,
    AGE,
    CASE
        WHEN AGE >= 65 THEN '노인'
        WHEN AGE >= 20 THEN '성인'
        ELSE '미성년자'
    END AS AGE_GROUP
FROM PEOPLE;


# 다양한 곳에서 사용 가능한 예시
-- ORDER BY에 조건을 줄 때도 사용함
ORDER BY 
  CASE 
    WHEN STATUS = 'VIP' THEN 1
    WHEN STATUS = '일반' THEN 2
    ELSE 3
  END

 

** BETWEEN 문 **

- A 이상, B 이하의 범위를 의미 (A <= 컬럼명 <= B) (대체 가능: 컬럼 >= A AND 컬럼 <= B)

- 주로 숫자, 날짜 범위 조건에 자주 쓰임. / BETWEEN은 양쪽 끝(A, B)을 포함함. (inclusive)

- 문자열에도 사용 가능하지만, 의도한 정렬 순서가 아닐 경우 문제가 될 수 있음.

# 예제
-- START_DATE가 2022년 9월 1일부터 30일 사이인 경우만 가져옵니다.
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'