[SQL/코드카타] 프로그래머스 62번 - 자동차 대여 기록에서 장기/단기 대여 구분하기

프로그래머스 62번

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📖 문제

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

 

 

🎯 과정

1.  WHERE 절로 2022년 09월 조건을 걸어 필터링하고
2.  SELECT 절에 출력을 원하는 컬럼을 적어준다.
3.  장기/단기 대여 구분을 위해 CASE WHEN 절을 사용하여 나누고
4.  대여기록 기준으로 내림차순하여 마무리!!

 

 

✍️ 내가 처음 작성한 쿼리문

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) >= 30 THEN '장기 대여'
               ELSE '단기 대여'
               END AS RENT_TYPE
FROM car_rental_company_rental_history
WHERE DATE_FORMAT(start_date, '%Y-%m') = '2022-09'
ORDER BY history_id DESC;

작성하여 완벽한 듯 보였으나 "틀렸습니다!" 😏 출력값은 나오기에 어떤 문제가 있는지 한참을 고민하였다. 오타가 있는지, 함수를 잘못 사용했는지 등등등....

그래도 답이 나오지 않아, 구글링을 하여 문제점을 확인하였다.

📌   두 날짜 간의 차이 즉, 두 날짜 사이의 일 수를 알아보기 위해 DATEDIFF(날짜1, 날짜2)를 사용한다.
  DATEDIFF(end_date, start_date)를 하면, 첫 날짜는 포함되지 않음.
  예를들어, DATEDIFF('2022-09-05', '2022-09-05') : 당일 대여하고 당일 반납을 할 경우, 결과는 '0'으로 반환!!!
  하지만, 대여일수의 경우에는 대여한 당일도 하루 포함해야 하기 때문에, DATEDIFF(end_date, start_date) +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(end_date, start_date)+1 >= 30 THEN '장기 대여'   # ✅ +1 적용
               ELSE '단기 대여'
               END AS RENT_TYPE
FROM car_rental_company_rental_history
WHERE DATE_FORMAT(start_date, '%Y-%m') = '2022-09'
ORDER BY history_id DESC;

 

 

🔍 틈새 문법

  • DATEDIFF(마지막 날짜, 처음 날짜) : 두 날짜의 차이를 알고 싶을 때 사용 
    • 대여일수 같은 것은 첫날도 포함시키는 것이므로 +1 을 해줘야 함
  • DATE_FORMAT(날짜, '%Y-%m-%d') : 시간 등이 포함된 상태에서 [연-월-일]만 뽑고 싶을 때 사용
    • '%Y' 처럼 대문자면 '2025'로 반환, '%y' 처럼 소문자면 '25'로 반환!