코딩테스트/SQL

[프로그래머스][MySQL] Lv. 1 자동차 대여 기록에서 장기/단기 대여 구분하기

_알파카 2024. 6. 6. 12:53
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이

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;

 

문제에서 요구하고 있는 사항은 다음과 같다. 

1. 대여 시작일이 2022년 9월에 속한다. 

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

-- 다른 풀이
WHERE START_DATE LIKE '2022-09-%'

 

2. 대여 기간이 30일 이상아면 '장기대여', 아니면 '단기 대여'로 지정하여 새로운 컬럼을 만든다. 

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

 

이 부분이 가장 유의해야 하는 부분이다. 

왜냐하면 오늘 대여하고 오늘 반납하는 경우에도 대여 기간은 하루가 되기 때문이다. 

즉, 

9월 1일 대여 => 9월 1일 반납 ====> 대여 기간 1일

= (9월 1일) - (9월 1일) + 1일

= 1일

 

혹은

9월 1일 대여 => 9월 3일 반납 ====> 대여 기간 3일

= (9월 3일) - (9월 1일) + 1일

= 3일

 

과 같이 계산되므로, 

종료일(END_DATE) - 시작일(START_DATE) + 1 

을 계산하면 대여 기간을 구할 수 있다. 

더불어, SQL에서 날짜 계산은 DATEDIFF 함수를 사용하므로, 

DATEDIFF(END_DATE, START_DATE) + 1

을 진행하면 된다. 

 

 

3. 다여 기록 ID를 기준으로 내림차순 한다. 

ORDER BY HISTORY_ID DESC;

 

4. 날짜 형식의 포맷을 지켜야 한다. 

DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE
DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE

 

개념(CASE_WHEN)

case문의 경우 조건에 따라 새로운 값을 부여하여 새로운 컬럼을 만들 때 사용한다. 

보통 아래와 같은 형식으로 사용된다. 

CASE WHEN 조건식 1 THEN ‘조건식 1 만족 시 반환하는 값’
     WHEN 조건식 2 THEN ‘조건식 2 만족 시 반환하는 값’
     ELSE ‘조건들에 만족 안 하는 경우 반환 값’
END AS '새롭게 만들 컬럼명'

 

728x90