문제 :
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 '장기 대여' 그렇지 않으면 '단기 대여' 로 표시하는 컬럼(컬럼명: RENT_TYPE)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
문제 해결 방식 :
-- WHERE 에서 대여 시작일 2022년 9월
-- CASE WHEN 으로 대여기간 30일 이상 >= 30 '장기대여' / 아니면 '단기 대여' >> 컬럼 RENT_TYPE
-- ORDER BY 대여 기록 ID DESC
사용 함수 : DATE_FORMAT, CASE WHEN, MONTH
결과 : 틀림
SELECT TB.*
FROM(
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE, DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE , CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기대여'
ELSE '단기대여' END AS RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY) TB
WHERE MONTH(TB.START_DATE) = 09
ORDER BY 1 DESC
틀린 이유 : 빌린 당일날 반납한 것은 1일 대여한 것으로 쳐야 함.. 30을 29로 바꾸니 정답 확인
SELECT TB.*
FROM(
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE, DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE , CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 29 THEN '장기 대여'
ELSE '단기 대여' END AS RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY) TB
WHERE MONTH(TB.START_DATE) = 09
ORDER BY 1 DESC
다른 풀이법 :
1. WHERE 을 다르게 사용
WHERE START_DATE LIKE '2022-09%'
WHERE YEAR(START_DATE) = 2022 AND MONTH(START_DATE) = 9
* DATEDIFF
두 날짜 간의 차이를 단순히 일(day) 단위로 계산
* TIMESTAMPDIFF 사용
- YEAR
- MONTH
- DAY
- HOUR
- MINUTE
- SECOND
예제
SELECT DATEDIFF(MONTH, '2023-01-01', '2024-09-19') AS month_diff ;
1) 경력 계산 : 직원의 입사일과 현재 날짜 사이의 차이를 계산할 때
SELECT
employee_name,
DATEDIFF(NOW(), hire_date) AS day_worked
FROM employees;
2) 이벤트 간격 계산 : 두 이벤트 사이의 시간을 측정할 때
SELECT
event_name,
TIMESTAMPDIFF(HOUR, start_time, end_time) AS event_duration_hours
FROM events ;
3) 유효 기간 계산 : 유효기간이나 만료일을 계산할 때
SELECT
product_name,
DATEDIFF(expire_date, NOW()) AS days_until_expiry
FROM products