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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

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

 

 

 

+ Recent posts