[프로그래머스/MySQL] 자동차 대여 기록에서 장기/단기 대여 구분하기

지누초이·2024년 3월 29일

프로그래머스

목록 보기
36/37
post-thumbnail

문제

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


노트

2022년 9월에 대여를 시작한 기록 중에서
30일 이상 대여는 '장기 대여', 아니면 '단기 대여'로 출력하는 문제이다.
간단하지만 날짜 관련 함수를 정리하고 함정을 하나 조심해야해서 남겨둔다.


  • 날짜 간 차이
    DATEDIFF(), TIMEDIFF() 등 월, 시간에 다른 함수들이있다.
    하지만 단위 별로 외우느니 다음 함수를 외우는게 나을 것 같다.

    • TIMESTAMPDIFF()

      TIMESTAMPDIFF(단위, 시작일, 종료일)

      주의해야할 것은 시작일이 종료일보다 크면 음수가 나온다.
      주의해야하는 이유는 위에 언급한 DATEDIFF, TIMEDIFF는 종료일을 앞에 두기 때문.

      예를 들어 2024년 3월 29일과 2024년 3월 31일의 날짜 차이를 구하는 코드는
      TIMESTAMPDIFF(DAY, '2024-03-29', '2024-03-31') 이 될 것이다.

  • 날짜 계산
    특정 날에 증감 연산을 할 수 있는 함수다.

    • DATE_ADD()

      DATE_ADD(날짜, INTERVAL 증감량 단위)

      만약 현재를 기준으로 하루를 더하고 싶으면
      DATE_ADD(NOW(), INTERVAL 1 DAY)

      현재를 기준으로 한달을 빼고 싶으면
      DATE_ADD(NOW(), INTERVAL -1 MONTH)

      가 될 것이다.

      DATE_SUB()도 있긴 하지만 증감량 부호만 바꾸면 되는데 굳이..?

  • 이 문제의 함정
    2024년 3월 29일에 시작해서 2024년 3월 29일까지 빌린 것은 함수 사용 시 0를 리턴할 것이다.
    하지만 위는 엄밀히 말하면 하루를 빌린 것이다.
    따라서 TIMASTAMPDIFF(DAY, START_DATE, END_DATE) + 1 이라고 해줘야 정확한 답이 나온다.


정답

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) + 1 >= 30 THEN '장기 대여'
        ELSE '단기 대여'
    END AS RENT_TYPE
FROM
    CAR_RENTAL_COMPANY_RENTAL_HISTORY 
WHERE
    START_DATE LIKE '2022-09%'
ORDER BY
    HISTORY_ID DESC

더 좋은 해결방법이 있다면 언제든 댓글로 알려주세요 🤗

0개의 댓글