본문 바로가기
JAVA/알고리즘

[ SQL Level4 ] 프로래머스 - 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

by hak0205 2024. 1. 21.
반응형

안녕하세요

프로그래머스 특정 기간 동안 대여 가능한 자동차들의 대여비용 구하기 풀이입니다.

 

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

 

프로그래머스

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

programmers.co.kr

 

-- 코드를 입력하세요
-- 1. 자동차종류가 세단 또는 SUV -> o
-- 2. 2022.11.01 ~ 2022.11.30 대여가능
--    대여가능하다는 말은 대여날짜에 포함이 안되어있다는 말이다.
-- 2.1. 30일간 대여금액이 50만원=> , < 200만원
-- 3. 정렬 : 금액 기준으로 내림차순 DECS, 자동차종류 오름차순 ASC, 자동차ID DESC

SELECT A.CAR_ID, A.CAR_TYPE
     , (((100 - C.DISCOUNT_RATE)/100)*A.DAILY_FEE)*30 AS FEE
  FROM CAR_RENTAL_COMPANY_CAR A
     , CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
  WHERE A.CAR_TYPE IN ('SUV','세단')
    --AND A.CAR_ID = B.CAR_ID 
    AND A.CAR_TYPE = C.CAR_TYPE
    AND A.CAR_ID NOT IN (
        SELECT CAR_ID
          FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY          
         --AND TO_DATE('2022-11','YYYY-MM') BETWEEN START_DATE AND END_DATE
         WHERE TO_CHAR(START_DATE,'YYYY-MM-DD') <'2022-12-01' -- 범위 체크하는 법 몰랐음
           AND TO_CHAR(END_DATE,'YYYY-MM-DD') > '2022-10-31' -- 범위 체크하는 법 올랐음
       
    )
    AND (((100 - C.DISCOUNT_RATE)/100)*A.DAILY_FEE)*30 BETWEEN 500000 AND 1999999 -- BETWEEN 사용법 제대로 체크 못함
    -- AND (((1 - C.DISCOUNT_RATE)/100)*A.DAILY_FEE)*30 <=2000000
    AND C.DURATION_TYPE = '30일 이상'  ---문제요건을 이거 빼먹음
    ORDER BY FEE DESC, A.CAR_TYPE ASC, A.CAR_ID DESC

 

 

문제에서 헷갈렸던 게 딱 1가지가 있는데요.

 

바로 11월(22.11.01~22.11.30)에 대여했던 차량은 제외하는 것입니다.

그러면 범위를 체크를 해야 하는데...

 

크게 2가지 방법이 있더라고요.

 

1. AND TO_DATE('2022-11', 'YYYY-MM') BETWEEN START_DATE AND END_DATE

--> 22년 11월 1일이 START_DATE와 END_DATE의 포함이 되어있는지

2. WHERE TO_CHAR(START_DATE, 'YYYY-MM-DD') <'2022-12-01'
           AND TO_CHAR(END_DATE, 'YYYY-MM-DD') > '2022-10-31'

 - BETWEEN보다 가독성은 떨어집니다.

 - 생각이 약간 필요합니다.

예를 들어 START_DATE가 22.10.31이고 END_DATE가 22.11.02이면 당연히 11월 안에 포함됩니다.

 

위의 식으로 다시 풀어보면 

2022-10-31(START_DATE) < 2022-12-01 이면서

2022-11-02(END_DATE) > 2022-10-31 

 

당연히 2022-11-01부터 2022-11-30 사이에 존재하므로 조회가 됩니다.

 

어쨌든 2번의 글이 이해가 조금 안 되었는데 이번기회에 이해가 되어서 좋았습니다.

 

범위체크는 하는 1번 2번 모두 알아두시면 좋습니다.

 

감사합니다.

 

 

반응형

댓글