본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 Kit / 자동차 대여 기록에서 장기/단기 대여 구분하기 / MySQL(DATEDIFF 함수)

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/151138)


📝풀이

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