[문제]
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
'DB > SQL' 카테고리의 다른 글
[SQL]변수 (0) | 2023.05.31 |
---|---|
[SQL] 데이터 형식, 형변환 (mysql) (0) | 2023.05.31 |
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |
[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력 (0) | 2023.05.30 |
[SQL] join, on (0) | 2023.05.25 |
[문제]
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
'DB > SQL' 카테고리의 다른 글
[SQL]변수 (0) | 2023.05.31 |
---|---|
[SQL] 데이터 형식, 형변환 (mysql) (0) | 2023.05.31 |
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |
[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력 (0) | 2023.05.30 |
[SQL] join, on (0) | 2023.05.25 |