728x90
📚문제
📝풀이
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 '장기 대여'
# WHEN DATE_ADD(START_DATE, INTERVAL 1 MONTH) -1 <= END_DATE THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC
DATEDIFF에서 +1을 해주는 이유는
DATEDIFF를 하게 되면 두 날짜의 일 수 차이가 나오기 때문에
렌트를 시작한 날도 포함해주어야 한다
( ex) END_DATE = '2022-09-20' , START_DATE = '2022-09-15' 일 경우 5일의 차이에 15일 포함해야 하므로 5+1)
내가 처음에 생각한 방법은 DATE_ADD였다
계속 오답이 나서 정답 코드와 함께 참고하다보니
DATE_ADD에 1 MONTH를 더하고 나온 값에 -1을 해주게 되면 정답처리가 된다
DATE_ADD 함수의 INTERVAL 1 MONTH는
START_DATE 월의 마지막 날짜를 기준으로 1달을 더한 값이 나온다
(ex 문제에서는 9월 기준이므로 '2022-09-30' INTEVAL 1 MONTH -> '2022-10-30'으로 나온다)
앞서 작성한 DATEDIFF의 이유와 비슷한 맥락으로 생각해보면
-1을 해주는 이유는 DATE_ADD에서 START_DATE와 END_DATE의 날짜를 모두 포함하기 때문인 것 같다
※ DATEDIFF => 시작날짜와 끝날짜 모두 포함안하고 차이만 계산 => 렌트날은 포함해야하므로 +1
DATE_ADD => 시작날짜와 끝날짜 모두 포함 => 하루는 빼줘야 하므로 -1
728x90
'SQL > 프로그래머스 SQL 고득점 kit' 카테고리의 다른 글
프로그래머스 / SQL 코딩테스트 연습 / 우유와 요거트가 담긴 장바구니 / MySQL (0) | 2023.11.20 |
---|---|
SQL 고득점 Kit / 상품을 구매한 회원 비율 구하기 / MySQL (0) | 2023.11.08 |
SQL 고득점 Kit / 그룹별 조건에 맞는 식당 목록 출력하기 - MySQL (1) | 2023.11.03 |
SQL 고득점 Kit / 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 - MySQL (WHERE절 서브쿼리) (0) | 2023.11.02 |
SQL 고득점 Kit / 주문량이 많은 아이스크림들 조회하기 - MySQL (0) | 2023.11.02 |