SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 20일차(3) 26.01.18(일)

nom_de_plume 2026. 1. 18. 21:34

부제:

자동차 대여 기록에서 장기/단기 대여 구분하기, 레벨 4

 

1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/151138
2. 정답 코드: 

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 like ("2022-09%")
order by history_id desc;


3. 오류 상황:

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 start_date like ("2022-09%")
order by history_id desc;

=> 날짜 차이 계산 오류

=> 날짜 필터링


4. 시도 방법:

=> 날짜 차이 계산할 때 +1 추가

=> 날짜 필터링 여러 방법 존재


5. 최종 문제 해결 방법:

=> 9월 1일에 빌려서 9월 1일에 바로 반납했다면 당일 대여이므로 대여 기간은 1일이다. 하지만 DATEDIFF('2022-09-01', '2022-09-01')의 결과는 0이 나온다. 즉, 문제에서 말하는 대여 기간을 정확히 계산하려면 DATEDIFF 결과에 1을 더해줘야 실제 대여 일수가 계산된다.

=> like "2022-09%" 방식도 좋다. 다만, start_date가 문자열이 아닌 DATE 타입일 경우, 성능이나 가독성을 위해 아래와 같은 방법들도 사용 가능.

 

WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'

 

WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'