코딩테스트/SQL 코딩테스트
<프로그래머스> 자동차 대여 기록에서 장기/단기 대여 구분하기
배또가또
2023. 12. 22. 21:05
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151138
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 문제 요구사항
- CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 9월에 속하는 기록에 대해
- 대여기간이 30일 이상이면 '장기대여', 그렇지 않으면 '단기 대여'로 표시하는 컬럼(컬럼명:RENT_TYPE)을 추가
- 대여기록을 출력하는 SQL문 작성
- 결과는 대여 기록을 기준으로 내림차순 정렬
대여기록을 비교하기 위해서는 END_DATE와 START_DATE를 비교해야하는데
이 때 MySQL은 DATEDIFF()함수를 사용해야 하고 Oracle은 해당하는 함수가 없기 때문에 그냥 뺄셈으로 비교해야한다.
그런데 MySQL에서는 그럼 뺄셈이 동작하지 않을까?
동작은 한다. 다만 날짜 데이터의 값에 상응하는 정수값으로 치환된 뒤에 계산이 되기 때문에
우리가 원하는 그 값은 아니게된다.
뺄셈 혹은 DIFF로 계산하면 5일에서 1일을 빼면 4가 정수로 반환된다
그런데 우리의 계산에서는 빌린 당일부터 1일이기 때문에 30일과 비교하는 것이 아니라 29일과 같거나 큰지
비교해야한다.
1) 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 >= 29 THEN '장기 대여'
ELSE '단기 대여'
END RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE TO_CHAR(START_DATE,'YYYY-MM') = '2022-09'
ORDER BY HISTORY_ID DESC;
2) MySQL
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 RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE,'%Y-%m') = '2022-09'
ORDER BY 1 DESC;