Lv1 - 자동차 대여 기록에서 장기/단기 대여 구분하기
📌 문제 정보
- 문제 이름 : 프로그래머스 - (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'