문제 링크 : 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. 날짜 차이 함수 사용 시 현실에서 동작하는 원리 적용하지 않음
'◖코딩 테스트◗▬▬▬▬▬▬▬▬▬ > 프로그래머스' 카테고리의 다른 글
[SQL KIT] (2024) 자동차 대여 기록 별 대여 금액 구하기(설명/코드/정답) (0) | 2024.02.08 |
---|---|
[SQL KIT] (2024) 그룹별 조건에 맞는 식당 목록 출력하기(설명/코드/정답) (0) | 2024.02.02 |
[프로그래머스] 속도 2배, 단축키(shortcuts, hot key) (0) | 2024.02.01 |
[SQL KIT] (2024)특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(설명/코드/정답) (0) | 2024.01.29 |
[SQL KIT] (2024) NULL 처리하기(설명/코드/정답) (0) | 2024.01.27 |