https://school.programmers.co.kr/learn/courses/30/lessons/157342
코드설명
TIMESTAMPDIFF + AVG + ROUND + GROUP BY + HAVING 을 활용합니다.
문제에서 신경써야할점은, 만약 2024년 3월 28일에 차를 빌렸다면, 2024년 3월 28일에 반납해도 1일이라는 점입니다.
그렇기에 TIMESTAMPDIFF를 활용해서 날짜를 구한뒤 + 1 을 처리해줍니다.
또, 추가로 TIMESTAMP 말고 DATEDIFF를 사용해도 됩니다.
이떄, ALAIS 의 AVERAGE_DURATION을 HAVING 절에서도 사용하므로 똑같이 적용되므로 >= 7 로 똑같이 적용해주면 됩니다.( 처음에는 +6 으로 적용했습니다. )
또 여기서, 굳이 HAVING을 안쓰고 GROUP BY 앞의 WHERE절에 따로 계산한다면 불필요 연산이 들어가므로 HAVING을 사용하여 필터링을 처리하도록 하는것이 좋아보입니다.
만약 CRCRH.END_DATE - CRCRH.START_DATE + 1 처럼 단순히 날짜를 뺸다면, 아래처럼 2321일이 나오는 경우도 있습니다.
SELECT CRCRH.CAR_ID AS CAR_ID, ROUND(AVG(CRCRH.END_DATE - CRCRH.START_DATE + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS CRCRH
GROUP BY CRCRH.CAR_ID
HAVING AVERAGE_DURATION >= 7.0
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
START_DATE와 END_DATE는 DATE 타입으로 숫자형이 아닌 문자열 형식이기에 문자열을 다시 숫자로 바꾸게 되는데, 이때 오류가 발생합니다. 이유는 20300101 - 20220101 은 80000 의 값이 나올 것 입니다. 실제로는 DATEDIFF로 일년마다 365 값이 처리되어야 하겠지요.
코드
SELECT CAR_ID, ROUND(AVG(TIMESTAMPDIFF(DAY, START_DATE, END_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
SELECT CRCRH.CAR_ID AS CAR_ID, ROUND(AVG(DATEDIFF(CRCRH.END_DATE, CRCRH.START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS CRCRH
GROUP BY CRCRH.CAR_ID
HAVING AVERAGE_DURATION >= 7.0
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
ORACLE
ORACLE에서는 MYSQL과 다르게 DATE TYPE에 대해서 알아서 날짜 연산이 진행됩니다.
그리하여 날짜 자체를 빼주면 되고, 아래의 코드에서 문제점은 찾을 수 없어보이나... 계속해서 답을 제출하면 틀립니다. ( 제가 틀린 것 일 수 있습니다)
다른 분들도 비슷한 오류를 겪는 것으로 보이는데, 어떤 오류인지 알 수 없어서 우선 아래의 코드를 제출했습니다.(제출하면 틀립니다.)
SELECT CRCRH.CAR_ID as CAR_ID, ROUND(AVG(CRCRH.END_DATE - CRCRH.START_DATE + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY CRCRH
GROUP BY CRCRH.CAR_ID
HAVING ROUND(AVG(CRCRH.END_DATE - CRCRH.START_DATE + 1), 1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC