코딩테스트/SQL
[프로그래머스][MySQL] Lv. 1 자동차 대여 기록에서 장기/단기 대여 구분하기
_알파카
2024. 6. 6. 12:53
728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/151138
풀이
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