자동차 대여 기록 문제 (IF문, CASE문 비교)

창하쿠·2025년 5월 26일

sql questions

목록 보기
4/7

📝 문제 요약

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
📌 2022년 9월에 대여를 시작한 기록만 골라서
📌 대여 기간이 30일 이상이면 '장기 대여', 아니면 '단기 대여'로 구분해야 한다.

그리고 결과는 날짜 형식을 YYYY-MM-DD로 출력하고,
대여 기록 ID(HISTORY_ID) 기준으로 내림차순 정렬한다.


🗂️ 테이블 구조

컬럼명타입설명
HISTORY_IDINTEGER대여 기록 ID
CAR_IDINTEGER자동차 ID
START_DATEDATE대여 시작일
END_DATEDATE대여 종료일

🧠 조건 분기 처리 방식 – IF() vs CASE

MySQL에서 조건을 나눠서 결과를 처리할 때는
✔️ IF() 함수
✔️ CASE WHEN
둘 다 쓸 수 있다.


🔹 방법 1: IF() 함수 – 간단한 분기일 때 👍

IF(조건식, 참일 때 반환값, 거짓일 때 반환값)

✅ 실전 적용 예시:

IF(DATEDIFF(END_DATE, START_DATE) + 1 >= 30, '장기 대여', '단기 대여')

📌 DATEDIFF()날짜 차이만 계산하므로 + 1을 해서 실제 대여 일수를 만든다.
예: 2022-09-01 ~ 2022-09-30DATEDIFF = 29+1 = 30일


🔸 방법 2: CASE WHEN 문 – 조건이 많을 때 가독성 최고 👌

CASE
  WHEN 조건 THEN 반환값
  ...
  ELSE 기본값
END

✅ 동일 로직 CASE 버전:

CASE
  WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
  ELSE '단기 대여'
END

⚔️ IF vs CASE 비교 요약

항목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

✅ 최종 SQL – IF 함수 사용 버전

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;

✅ 최종 SQL – CASE WHEN 사용 버전

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_IDCAR_IDSTART_DATEEND_DATERENT_TYPE
532022-09-162022-10-15단기 대여
412022-09-012022-09-30장기 대여
322022-09-052022-09-05단기 대여
142022-09-272022-10-26장기 대여

🧩 마무리 요약

체크포인트 🔍설명
IF()간단한 조건 분기에 최적화된 함수
CASE WHEN조건이 많거나 복잡할 때 구조적으로 보기 편함
DATEDIFF + 1시작일~종료일을 포함한 대여 일수 계산할 때 필수
BETWEEN날짜 필터링은 항상 이 방식 우선 고려 (성능과 인덱스 활용 가능)
DATE_FORMAT()출력 날짜 포맷 통일 (%Y-%m-%d)로 정답 처리

🚀 한 줄 정리

IF()는 삼항연산자처럼 쓰고, CASE는 if-else처럼 쓰자.

profile
아무것도 모르는 아무개

0개의 댓글