프로그래머스
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'로 반환!
'SQL' 카테고리의 다른 글
| [SQL/코드카타] 프로그래머스 64번 - 헤비유저가 소유한 장소 (0) | 2025.09.12 |
|---|---|
| [SQL] SQL 작성 전 체크리스트 (0) | 2025.09.03 |
| [SQL/코드카타] 프로그래머스 55번 - 조건에 맞는 사용자 조회하기 | CONCAT | SUBSTR (1) | 2025.09.01 |