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

허다람·2024년 5월 22일

SQL

목록 보기
37/67
post-thumbnail

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

💻 문제 설명

다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

💡 문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

🎲 예시

예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

2022년 9월의 대여 기록 중 '장기 대여' 에 해당하는 기록은 대여 기록 ID가 1, 4인 기록이고, '단기 대여' 에 해당하는 기록은 대여 기록 ID가 3, 5 인 기록이므로 대여 기록 ID를 기준으로 내림차순 정렬하면 다음과 같이 나와야 합니다.

📟 소스 코드

IF문과 CASE문에서 검증 시 30일이 아니라 29일로 체크해야 한다.

📝 MySQL

SELECT HISTORY_ID, CAR_ID, 
    DATE_FORMAT(START_DATE, '%Y-%m-%d') AS DATE_FORMAT, 
    DATE_FORMAT(END_DATE, '%Y-%m-%d') AS DATE_FORMAT, 
IF(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09-%'
ORDER BY HISTORY_ID DESC
-- 날짜 차이를 구하기 위해 DATEDIFF 함수를 사용해 END_DATE - START_DATE 값을 구한다.
-- IF 문을 사용해 날짜 차가 29일 이상일 경우 '장기대여' 그 외의 경우 '단기 대여'를 출력한다.

📝 Oracle

SELECT HISTORY_ID
    , CAR_ID
    , TO_CHAR(START_DATE, 'YYYY-MM-DD') START_DATE
    , TO_CHAR(END_DATE, 'YYYY-MM-DD') END_DATE
    , CASE WHEN (END_DATE - START_DATE) >= 29 THEN '장기 대여'
            ELSE '단기 대여'
        END
    RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE TO_CHAR(START_DATE, 'YYYY-MM') LIKE '2022-09%'
ORDER BY HISTORY_ID DESC
-- CASE WHEN 표현식을 사용해 두 날짜 차에 조건을 걸어 출력한다.

날짜의 경우 2022-09-01 ~ 2022-09-01 동안 대여했을 시 0일을 대여한 게 아니라 하루 대여 한 것으로 봐야한다. 때문에 2022-09-01 ~ 2022-09-30이면 날짜의 차는 29이지만 대여일은 30일로 볼 수 있다.

IF 문과 비슷한 기능을 하는 DECODE 함수가 있지만 부등호 조건을 사용할 수 없다. DECODE 함수를 대체할 수 있는 기능으로 CASE 표현식이있다.

📺 실행 결과

profile
나 java봐라

0개의 댓글