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

 

프로그래머스

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

programmers.co.kr

코드설명

DATE_FORMAT + CASE WHEN END + TIMESTAMPDIFF + DATE_DIFF 를 활용합니다.

 

DATE_FORMAT으로 각 날짜를 원하는 형식으로 변환시킵니다.

CASE문으로 각 날짜 간의 차이를 계산합니다.

이떄, TIMESTAMPDIFF를 활용해서 각 날짜별 차이를 손쉽게 계산합니다.

 

각 2022-09 월을 구할때는 YEAR(START_DATE) = '2022' AND MONTH(START_DATE) = '9'로 처리해도되고, 

START_DATE LIKE '%2022-09%' 로 처리해도됩니다.

 

SQL에서는 풀 수 있는 방법이 정말 많습니다.

하지만, 각 쿼리별로 속도가 중요합니다.

 

TIMESTAMPDIFF 대신에 DATE_DIFF 날짜 차이를 구하는 함수를 사용해도 됩니다.

 

문제의 각 날짜 별 차이를 구하는 함수들은 모두 ANSI SQL이 아닌, MYSQL에서 제공하는 함수입니다.

ANSI SQL을 구현하려한다면, 위의 함수들을 사용할 수 없는데, 날짜간의 차이를 ANSI SQL을 통하여 구현하는 방법은 방법을 못찾아 현재로써는 DBMS에 존재하는 함수들을 사용하여 진행합니다.

 

추가로,  30일 이상인데 29로 처리한것은 시작날짜부터 1일로 처리하기에 그렇습니다.

 

DATEDIFF(END_DATE, START_DATE) = END_DATE - START_DATE , 즉 두 날짜 간의 차이를 반환하므로 하루를 더해야만 정확히 30일인 경우를 포함합니다.

대여 기간 계산: 문제에서는 "대여 기간이 30일 이상"이라고 명시되어 있습니다. 하지만 DATEDIFF 함수는 두 날짜 사이의 날짜 수를 반환하므로, 정확히 30일인 경우를 포함하지 않습니다.

코드

TIMESTAMPDIFF(DAY, 시작날짜, 끝날짜)를 사용한 코드입니다.

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 TIMESTAMPDIFF(DAY, START_DATE, END_DATE) >= 29 THEN '장기 대여'
    WHEN TIMESTAMPDIFF(DAY, START_DATE, END_DATE) < 29 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;

 

DATE_DIFF를 활용하여 날짜별 차이를 구하는 함수입니다.

SELECT HISTORY_ID AS HISTORY_ID, 
CAR_ID AS 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(CRCRH1.END_DATE, CRCRH1.START_DATE) >= 29 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS CRCRH1
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY CRCRH1.HISTORY_ID DESC

 

TIMESTAMPDIFF를 활용한 코드입니다.

-- 코드를 입력하세요

SELECT HISTORY_ID AS HISTORY_ID, 
CAR_ID AS CAR_ID,
DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE, 
DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE, 
CASE 
WHEN TIMESTAMPDIFF(DAY, CRCRH1.START_DATE, CRCRH1.END_DATE) >= 29 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS CRCRH1
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY CRCRH1.HISTORY_ID DESC

 

대여 기간 계산: 문제에서는 "대여 기간이 30일 이상"이라고 명시되어 있습니다. 하지만 DATEDIFF 함수는 두 날짜 사이의 날짜 수를 반환하므로, 정확히 30일인 경우를 포함하지 않습니다.

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

+ Recent posts