https://school.programmers.co.kr/learn/courses/30/lessons/151138
코드설명
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
'SQL > 프로그래머스' 카테고리의 다른 글
[SQL][프로그래머스] 나이 정보가 없는 회원 수 구하기 - COUNT + ISNULL MYSQL (0) | 2024.03.25 |
---|---|
[SQL][프로그래머스] 가장 비싼 상품 구하기 - MAX Mysql (0) | 2024.03.25 |
[SQL][프로그래머스] 특정 옵션이 포함된 자동차 리스트 구하기 - LIKE + ORDER BY Mysql (0) | 2024.03.25 |
[SQL][프로그래머스] Python 개발자 찾기 - IN + OR + ORDER BY Mysql (0) | 2024.03.25 |
[SQL][프로그래머스] 잔챙이 잡은 수 구하기 - ISNULL + IS NULL + COUNT Mysql (0) | 2024.03.25 |