코딩 테스트 연습/[프로그래머스][리트코드] MySQL

[LV.4] String, Date > 자동차 대여 기록에서 장기/단기 대여 구분하기

duswjd_data 2025. 7. 1. 10:56

문제

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

 

프로그래머스

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

programmers.co.kr


문제 설명

  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서
    대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여
    대여기록을 출력하는 SQL문을 작성
  • 결과는 대여 기록 ID를 기준으로 내림차순 정렬
  • 주의사항) START_DATE와 END_DATE의 경우 예시의 데이트 포맷과 동일해야 정답처리

정답 코드

SELECT HISTORY_ID,
       CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d'),
       DATE_FORMAT(END_DATE, '%Y-%m-%d'),
       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

코드 설명

  • DATE_FORMAT(START_DATE, '%Y-%m-%d') : 날짜 형식을 YYYY-MM-DD 형식으로 변환
  • DATEDIFF(END_DATE, START_DATE) : 시작일과 종료일 사이의 일수를 계산
    * DATEDIFF 함수는 종료일을 포함하지 않음+1을 추가하여 종료일을 포함한 날짜 차이를 계산

개선된 코드

SELECT HISTORY_ID,
       CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d'),
       DATE_FORMAT(END_DATE, '%Y-%m-%d'),
       CASE
            WHEN (DATEDIFF(END_DATE, START_DATE)+1) >= 30 THEN '장기 대여'
            ELSE '단기 대여'
       END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-09-01' AND START_DATE < '2022-10-01'
ORDER BY HISTORY_ID DESC
  • WHERE START_DATE >= '2022-09-01' AND START_DATE < '2022-10-01'
    • BETWEEN 보다 범위 설정이 더 직관적이고 명확함

첫 번째 시도 (실패)

SELECT HISTORY_ID,
       CAR_ID,
       DATE_FORMAT(START_DATE, '%Y-%m-%d'),
       DATE_FORMAT(END_DATE, '%Y-%m-%d'),
       CASE
            WHEN DATEDIFF(END_DATE, START_DATE) >= 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
  • DATEDIFF(END_DATE, START_DATE) : 종료일을 제외한 일수를 계산
    → 대여 시작일과 종료일을 포함한 기간을 계산하려면 1일을 추가해야 함