SQL/MySQL - 프로그래머스

[Lv.2] 자동차 평균 대여기간 구하기 [datediff, timediff, avg, round]

셈뇽 2024. 5. 6. 19:10
문제 파악

  • 출력할 컬럼 : 자동차 ID, 평균 대여 기간(AVERAGE_DURATION) → SELECT
  • 가져올 테이블 : CAR_RENTAL_COMPANY_RENTAL_HISTORY → FROM
  • 요구조건 1 : 자동차 ID별 평균 대여기간 집계 CAR_ID → group by
  • 요구조건 2 : 평균 대여 기간 7일 이상인 자동차만 출력  → having
  • 정렬 순서: 평균 대여 기간을 기준으로 내림차순, 자동차 ID기준 내림차순 → Order by

 

문제 해결 과정

 

💡 DATEDIFF()

두 기간 사이의 일수를 계산하는 함수

 

format : DATEDIFF(종료일, 시작일)

SELECT DATEDIFF('2021-01-07','2021-01-01')
>> 6

 

 주의할 점 !!

⇒ 날짜에 시간이 포함되어 있는 경우, 시간은 계산에 포함되지 않는다

⇒ 날짜 범위에서 벗어나는 값을 입력하는 경우 NULL 반환

 

 

💡 TIMEDIFF()

 두 기간 사이의 시간을 계산하는 함수

 

format : TIMEDIFF(종료시간, 시작시간)

SELECT TIMEDIFF('2024-04-17 10:00:00', '2024-04-16 20:00:00')
>> 14:00:00

 

 

💡 AVG()

평균을 구하는 함수

 

format : AVG(컬럼명)

SELECT AVG(Start_date) from Date_date;
SELECT AVG(ISNULL(Start_date,0)) from Date_date;

 

 주의할 점 !!

⇒ NULL이 있을 경우 NULL값을 제외하고 평균을 계산하기 때문에 값이 달라질 수 있다.

상황에 따라서 NULL을 0으로 대체하고 써야 함

 

 

💡 ROUND()

소수점 반올림 함수

 

format : ROUND(적용 대상, 반올림 자릿수)

## 1. 소수에 적용

SELECT ROUND(123.567,0)   >> 소수점 모두 반올림
       ROUND(123.567,1)   >> 소수점 첫 번째 자리까지 반올림  = 소수점 두 번째 자리에서 반올림
       ROUND(123.567,2)   >> 소수점 두 번째 자리까지 반올림
       
       >> 124
       >> 123.6
       >> 123.57
       

## 2. 정수에 적용

SELECT ROUND(12345, -1)   >> 정수 첫 번째 자리 반올림 = 일의자리에서 반올림
       ROUND(12345, -2)   >> 정수 두 번째 자리 반올림
       ROUND(12345, -3)   >> 정수 세 번째 자리 반올림
       
       >> 12350
       >> 12300
       >> 12000

 

 

 

문제 해결

> 완성 코드

select CAR_ID, round(avg(datediff(END_DATE,START_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;