DB/SQL

[SQL]프로그래머스 - 자동차 평균 대여 기간 구하기

journey-dev 2023. 5. 31. 11:50

[문제]

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



[풀이]

1. CAR_ID와 각 행별 대여기간을 구한 인라인 뷰 테이블을 만든다. (from 절에서 서브쿼리)

2. 이후 group by로 car_id별로 묶은 후 평균 대여일을 구하는데

3. 그 결과에서 having으로 7일 이상인 데이터만 필터한다.

4. select문에서 그 평균 값을 ROUND로 반올림 해주고

5. 정렬해준다.

select CAR_ID, ROUND(AVG(dif),1) as AVERAGE_DURATION
from
(select CAR_ID,  (datediff(END_DATE,START_DATE)+1) as dif  from CAR_RENTAL_COMPANY_RENTAL_HISTORY ) T
group by T.CAR_ID 
having  AVG(dif) >= 7
order by AVERAGE_DURATION desc, CAR_ID desc

 

[피드백]

<날짜 차이 구하기>

1. 두 날짜의 차이를 일수로 반환

 

[Mysql] : DATEDIFF(날짜1, 날짜2)

SELECT DATEDIFF(END_DATE,START_DATE); -- 반환값 : 365

 

[Postgresql] : 그냥 두 date를 빼면 

select end_date - start_date::date as diff from table  -- 반환값: 365

 

 

2. 두 날짜의 차이를 선택한 단위로 반환

 

[Mysql] : TIMESTAMPDIFF(단위,날짜1, 날짜2)

SELECT TIMESTAMPDIFF(단위, 날짜1, 날짜2);

- 단위: year(년), quarter(분기),  month(월), week(주), day(일), hour(시) , minute(분), second(초)

- 예제

SELECT TIMESTAMPDIFF(SECOND, '2022-02-07', '203-09-25');

 

[Postgresql]   

EXTRACT(field FROM source)

- field (단위) : century(세기), year(년), quarter(분기),  month(월), week(주), day(일), hour(시) , minute(분), second(초) 

- source: timestamp, time, or interval 타입 이여야 함

- 예제

 
SELECT end_date - start_date::date as diff FROM test -- 두 기간 간의 날짜 차이(2022-09-25 - 2023-02-07)

SELECT EXTRACT(day FROM end_date::TIMESTAMP ) - EXTRACT(day FROM start_date::TIMESTAMP ) from test; -- 단순히 두 일 끼리의 차이 (25-07)
SELECT EXTRACT(YEAR FROM end_date) - EXTRACT(YEAR FROM start_date) from test; -- 년 차이 구하기 (2023-2022)
SELECT EXTRACT(MONTH FROM end_date::TIMESTAMP ) - EXTRACT(MONTH FROM start_date::TIMESTAMP ) from test; -- 월 차이 (09-02)
SELECT EXTRACT(QUARTER FROM end_date::TIMESTAMP ) - EXTRACT(QUARTER FROM start_date::TIMESTAMP ) from test; -- 분기 차이

 

 

<소수점 올림,버림>

ROUND()

  select ROUND(123.567,-1), ROUND(123.567,-2), ROUND(123.567,0), ROUND(123.567,1), ROUND(123.567,2);

CEILING()

 select CEILING(123.567)

 


참고자료

mysql 공식문서 : https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_datediff

postgresql 공식문서 : https://www.postgresql.org/docs/current/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT