Coding Test/SQL Coding Test

[프로그래머스 / SQL] - 자동차 대여 기록에서 장기/단기 대여 구분하기

nam_ji 2024. 6. 11. 22:19

자동차 대여 기록에서 장기/단기 대여 구분하기

문제

  • 자동차 회사의 자동차 대여 기록 정보가 담긴 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 있습니다.
  • CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
    1. 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해
    2. 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여'로 표시하는 컬럼을
    3. 컬럼명 RENT_TYPE으로 수정하여
    4. 대여 기록 ID를 기준으로 내림차순 정렬하여
  • 조회하는 문제입니다.


프로그래머스 코드

  • 두 가지의 풀이를 가져와 봤습니다.
  • 공통적으로 SELECT에 HISTORY_ID, CAR_ID, DATE_FORMAT을 이용하여 START_DATE와 END_DATE 조회하는 부분은 같은 QUERY 입니다.
  • 다른 점은 IF문 사용하는 방법과 CASE문을 사용한 방법입니다.
  • 먼저 IF문은 첫 번째 인자는 조건, 두 번째는 참일 때, 세 번째는 거짓일 때를 작성합니다.
  • CASE문은 CASE를 작성하고 WHEN에 조건을 THEN에는 결과를 작성합니다.
  • END 뒤에는 출력될 컬럼명을 작성하는 방법입니다.
  • IF문과 CASE문 둘 다 특정 날짜를 계산해야 하기 때문에 DATEDIFF 함수를 사용했습니다.
  • DATEDIFF 함수는 첫 번째 인자에서 두 번쨰 인자를 빼는 함수입니다.
    여기서 중요한 점은 날짜에서 날짜를 빼면 우리가 원하는 날짜보다 1이 적게 출력되기 때문에 + 1을 해주거나 코드에서 30 대신 29로 하여 + 1을 해주지 않는 방법도 있습니다.
  • 이렇게 30일 이상인지 미만인지 구분할 수 있게 하고
  • FROM을 통해 조회하고 싶은 컬럼이 속한 테이블 명을 작성하고
  • WHERE절을 통해 특정 날짜 내에서 조회할 수 있게 합니다.
  • 마지막으로 ORDER BY를 통해 정렬 순서를 정해줍니다.
-- 코드를 입력하세요
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,
    IF(DATEDIFF(END_DATE, START_DATE) + 1 >= 30, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY HISTORY_ID DESC;

# 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 '단기 대여'
#         # WHEN DATEDIFF(END_DATE, START_DATE) < 30 THEN '단기 대여'
#     END AS RENT_TYPE
# FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
# WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
# ORDER BY HISTORY_ID DESC;