Dev Hyeri

◖코딩 테스트◗▬▬▬▬▬▬▬▬▬/프로그래머스

[SQL KIT] (2024) 자동차 대여 기록에서 장기/단기 대여 구분하기(설명/코드/정답)

_hyeri 2024. 2. 5. 16:23

 

문제 링크 : 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,
       IF((TIMESTAMPDIFF(DAY, START_DATE, END_DATE)+1)>=30, '장기 대여','단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC

 

내부 동작 순서 

 

1. FROM 절

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 대상으로 합니다.

 

2. WHERE 절

START_DATE가 '2022-09%'와 일치하는 행만 선택합니다. 여기서 '%'는 와일드카드로, '2022-09'로 시작하는 모든 날짜를 의미합니다.

 

3. SELECT 절

HISTORY_ID, CAR_ID, START_DATE, END_DATE를 선택합니다.
DATE_FORMAT 함수를 사용하여 START_DATE와 END_DATE를 지정된 형식으로 변환합니다.
IF 함수를 사용하여 대여 기간이 30일 이상인 경우 '장기 대여', 그렇지 않은 경우 '단기 대여'를 생성하는 RENT_TYPE를 선택합니다.

 

4. ORDER BY 절

결과를 HISTORY_ID를 기준으로 내림차순으로 정렬합니다.

 

 

 

 

쿼리 작성 중에 발생할 수 있는 실수. 

  • 날짜 차이 +1
    • 날짜 차이 함수를 사용하게 되면 '1-1=0'인 것과 같이 동일 날짜에 대여와 반납이 이루어졌을 경우 차이의 값은 0이 된다. 이는 날짜 차이 함수에서 나온 결괏값은 '빌리게 된 날을 제외한 랜탈한 기간'으로 봐야 적당할 것이다. 빌리게 된 날부터 1일이 되는 현실과 차이가 있으므로 빌리게 된 날짜 1을 무조건 확보하고 가야 한다.
    • 아래 이미지를 보면 중간의 START_DATE, END_DATE의 양쪽으로 두가지 경우의 출력 결과를 확인할 수 있다. 좌측은 그냥 "날짜 차이 함수"를 썼을 때의 결과, 우측은 "날짜 차이 함수 + 빌린날 하루를 더한" 결과이다. 문제의 조건에서 날짜차이를 조회하지는 않지만  빨간색 상자  부분에서 RENT_TYPE이 달라지기 때문에 오답 처리된다.

  • '장기 대여' '단기 대여'를 띄어쓰기 없이 '장기대여', '단기대여' 로 작성

 

 

 


 

초기 코드

 

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,
       IF(TIMESTAMPDIFF(DAY, START_DATE, END_DATE)>=30, '장기대여','단기대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC

 

=>오류

 

 

 

오류 원인

1. 장기 대여 -> 장기대여, 단기 대여-> 단기대여로 띄어쓰기 없이 작성

2. 날짜 차이 함수 사용 시 현실에서 동작하는 원리 적용하지 않음