Lv1. 자동차 대여 기록에서 장기/단기 대여 구분하기 (MySQL)
링크: https://school.programmers.co.kr/learn/courses/30/lessons/151138
내가 작성한 코드
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) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여' END AS RENT_TYPE
-- DATEDIFF(END_DATE, START_DATE) >= 29
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') = '2022-09'
ORDER BY HISTORY_ID DESC;
Oracle
SELECT HISTORY_ID, CAR_ID
,TO_CHAR(START_DATE, 'YYYY-MM-DD') AS START_DATE
,TO_CHAR(END_DATE, 'YYYY-MM-DD') AS END_DATE
,CASE WHEN (END_DATE - START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여' END AS RENT_TYPE
-- (END_DATE - START_DATE) >= 29
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE, 'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;
문제 회고
1. 날짜 차이 계산
- DATEDIFF(END_DATE, START_DATE) + 1 >= 30
- 빌린 당일에 반납 해도 1일을 대여한 것으로 간주해야 하므로 DATEDIFF의 차이 값에 +1을 더해
실제 대여 일수를 구한 뒤 30일과 비교한다
- DATEDIFF(END_DATE, START_DATE) >= 29
- DATEDIFF는 종료일에서 시작일을 뺀 날짜 사이의 차이를 구하는 함수이다
- 실제 대여 일수가 30일일 때 DATEDIFF의 결과값은 항상 1이 작은 29가 된다
- 따라서 '대여 기간이 30일 이상' 이라는 조건은 날짜 차이 29 이상 이라는 조건과 논리적으로 동일하므로
기준값을 29로 설정하여 푼 방식이다
- 이해하기: DATEDIFF(END_DATE, START_DATE) >= 30 - 1 = 29
2. Oracle의 날짜 계산
- 오라클은 DATEDIFF 같은 별도의 함수를 쓰지 않고 단순 뺼셈만으로 두 날짜 사이의 차이를 구할 수 있다