CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
📌 2022년 9월에 대여를 시작한 기록만 골라서
📌 대여 기간이 30일 이상이면 '장기 대여', 아니면 '단기 대여'로 구분해야 한다.
그리고 결과는 날짜 형식을 YYYY-MM-DD로 출력하고,
대여 기록 ID(HISTORY_ID) 기준으로 내림차순 정렬한다.
| 컬럼명 | 타입 | 설명 |
|---|---|---|
| HISTORY_ID | INTEGER | 대여 기록 ID |
| CAR_ID | INTEGER | 자동차 ID |
| START_DATE | DATE | 대여 시작일 |
| END_DATE | DATE | 대여 종료일 |
IF() vs CASEMySQL에서 조건을 나눠서 결과를 처리할 때는
✔️ IF() 함수
✔️ CASE WHEN 문
둘 다 쓸 수 있다.
IF() 함수 – 간단한 분기일 때 👍IF(조건식, 참일 때 반환값, 거짓일 때 반환값)
✅ 실전 적용 예시:
IF(DATEDIFF(END_DATE, START_DATE) + 1 >= 30, '장기 대여', '단기 대여')
📌 DATEDIFF()는 날짜 차이만 계산하므로 + 1을 해서 실제 대여 일수를 만든다.
예: 2022-09-01 ~ 2022-09-30 → DATEDIFF = 29 → +1 = 30일
CASE WHEN 문 – 조건이 많을 때 가독성 최고 👌CASE
WHEN 조건 THEN 반환값
...
ELSE 기본값
END
✅ 동일 로직 CASE 버전:
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END
| 항목 | IF() 함수 | CASE WHEN 문 |
|---|---|---|
| 가독성 | 짧고 간결 (2분기 조건) | 복잡한 조건일수록 더 깔끔 |
| 구조 | 삼항연산자 느낌 | if-else-if 느낌 |
| 권장 사용 | 간단한 조건 1~2개 | 2개 이상이거나 복잡한 조건 많을 때 ✅ |
🔸 잘못된 방식 (느림)
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
✅ 추천 방식 (빠르고 인덱스 가능)
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
📌 실무에서는 항상 BETWEEN 범위 조건을 먼저 고려하자!
문제에서 요구한 출력 포맷은 YYYY-MM-DD
MySQL은 기본적으로 시:분:초도 함께 출력되기 때문에
DATE_FORMAT() 함수로 명시적으로 포맷을 지정한다.
DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE
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,
IF(DATEDIFF(END_DATE, START_DATE) + 1 >= 30, '장기 대여', '단기 대여') 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;
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;
| HISTORY_ID | CAR_ID | START_DATE | END_DATE | RENT_TYPE |
|---|---|---|---|---|
| 5 | 3 | 2022-09-16 | 2022-10-15 | 단기 대여 |
| 4 | 1 | 2022-09-01 | 2022-09-30 | 장기 대여 |
| 3 | 2 | 2022-09-05 | 2022-09-05 | 단기 대여 |
| 1 | 4 | 2022-09-27 | 2022-10-26 | 장기 대여 |
| 체크포인트 🔍 | 설명 |
|---|---|
IF() | 간단한 조건 분기에 최적화된 함수 |
CASE WHEN | 조건이 많거나 복잡할 때 구조적으로 보기 편함 |
DATEDIFF + 1 | 시작일~종료일을 포함한 대여 일수 계산할 때 필수 |
BETWEEN | 날짜 필터링은 항상 이 방식 우선 고려 (성능과 인덱스 활용 가능) |
DATE_FORMAT() | 출력 날짜 포맷 통일 (%Y-%m-%d)로 정답 처리 |
IF()는 삼항연산자처럼 쓰고,CASE는 if-else처럼 쓰자.