
📑 1. 특정 옵션이 포함된 자동차 리스트 구하기

문제
CAR_RENTAL_COMPANY_CAR 테이블에서 '네비게이션' 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
⭐ 정답코드
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;
📑 2. 자동차 대여 기록에서 장기/단기 대여 구분하기

📌 틀린코드
SELECT HISTORY_ID, CAR_ID,
DATE_FORMAT(START_DATE, '%Y-%m-%d'),
DATE_FORMAT(END_DATE, '%Y-%m-%d'),
CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;
WHERE 절에 START_DATE 가 DATE 타입인데 문자열로 조회해서 틀린 것 같음
LIKE 대신 BETWEEN 으로 수정해 줌
다시 오답처리 됨
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d'),
DATE_FORMAT(END_DATE, '%Y-%m-%d'),
CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여'
ELSE '단기 대여'
END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;
SELECT 절에 DATE_FORMAT 부분에 별칭을 줌
또 오답처리 됨
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
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;
내 쿼리문은 잘 출력되고 실행 결과도 출력 예시랑 같다.
조건이 잘못된 거 같다.

⭐ 정답코드
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
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;
또는
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
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;
내 코드 수정 전
CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여'
ELSE '단기 대여'
내 코드수정 후
CASE WHEN DATEDIFF(END_DATE, START_DATE) < 29 then '단기 대여'
ELSE '장기 대여'
이 문제가 오답률이 높은 이유는 날짜 계산 차이 때문
처음에는 아래처럼 생각했다.
DATEDIFF(END_DATE, START_DATE)가 30일 이상이면 '장기 대여'로 처리.
그렇지 않으면 '단기 대여'로 처리.
즉, 30일 이상과 30일 미만으로 나누는 구조
하지만 문제를 풀 때 간과한 사실이 있다.
빌린 당일에 반납하면 그 대여기간은 며칠일까?
빌린 당일에 반납한 경우, 대여 기간은 1일로 간주하는 것이 일반적이다.
보통 대여 서비스에서는 "대여 시작일과 반납일이 동일"해도, 대여 기간을 최소 1일로 계산한다.
DATEDIFF(END_DATE, START_DATE) 함수는 END_DATE와 START_DATE의 일 단위 차이를 계산하는 함수인데 예를 들어서 DATEDIFF('2022-09-01', '2022-09-01')의 결과는 0이다. 하지만 실제 대여 기간으로는 "빌린 날을 포함"해 최소 1일로 간주해야 한다. 일단 빌리고 당일 반납했다고 하더라도 대여 기간은 1일이기 때문이다.
한 마디로 대여 시작일과 대여 종료일 둘다 대여기간에 포함된다.
따라서 DATEDIFF 함수쓰고 + 1 해줘야 한다.
그래서 DATEDIFF < 29일 때를 '단기 대여'로 간주하고
29 미만를 단기 대여로 처리하고, 29 이상(ELSE 구문)을 장기 대여로 간주하도록 조건을 수정했다.
📌 최적 코드
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(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y%m') = '202209'
ORDER BY HISTORY_ID DESC;
IF문으로 3항 연산자처럼 쓸 수 있구나...
IF(condition, value_if_true, value_if_false)
IF(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
'코딩테스트 > SQL테스트' 카테고리의 다른 글
[프로그래머스] (MySQL) 중성화 여부 파악하기 문제풀이 (14) | 2025.01.18 |
---|---|
[프로그래머스] (MySQL) 이름에 el이 들어가는 동물 찾기 문제풀이 (8) | 2025.01.16 |
[프로그래머스] (MySQL) 조건에 부합하는 중고거래 상태 조회하기 (4) | 2025.01.14 |
[프로그래머스] (MySQL) 자동차 평균 대여 기간 구하기 문제 풀이 (10) | 2025.01.14 |
[프로그래머스] (MySQL) 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 문제풀이 (64) | 2024.11.25 |

📑 1. 특정 옵션이 포함된 자동차 리스트 구하기

문제
CAR_RENTAL_COMPANY_CAR 테이블에서 '네비게이션' 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
⭐ 정답코드
SELECT * FROM CAR_RENTAL_COMPANY_CAR WHERE OPTIONS LIKE '%네비게이션%' ORDER BY CAR_ID DESC;
📑 2. 자동차 대여 기록에서 장기/단기 대여 구분하기

📌 틀린코드
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d'), DATE_FORMAT(END_DATE, '%Y-%m-%d'), CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여' ELSE '단기 대여' END AS RENT_TYPE FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE LIKE '2022-09%' ORDER BY HISTORY_ID DESC;
WHERE 절에 START_DATE 가 DATE 타입인데 문자열로 조회해서 틀린 것 같음
LIKE 대신 BETWEEN 으로 수정해 줌
다시 오답처리 됨
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d'), DATE_FORMAT(END_DATE, '%Y-%m-%d'), CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여' ELSE '단기 대여' END AS RENT_TYPE FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30' ORDER BY HISTORY_ID DESC;
SELECT 절에 DATE_FORMAT 부분에 별칭을 줌
또 오답처리 됨
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 WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30' ORDER BY HISTORY_ID DESC;
내 쿼리문은 잘 출력되고 실행 결과도 출력 예시랑 같다.
조건이 잘못된 거 같다.

⭐ 정답코드
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 WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30' ORDER BY HISTORY_ID DESC;
또는
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 WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30' ORDER BY HISTORY_ID DESC;
내 코드 수정 전
CASE WHEN DATEDIFF(END_DATE, START_DATE) >= 30 THEN '장기 대여' ELSE '단기 대여'
내 코드수정 후
CASE WHEN DATEDIFF(END_DATE, START_DATE) < 29 then '단기 대여' ELSE '장기 대여'
이 문제가 오답률이 높은 이유는 날짜 계산 차이 때문
처음에는 아래처럼 생각했다.
DATEDIFF(END_DATE, START_DATE)가 30일 이상이면 '장기 대여'로 처리.
그렇지 않으면 '단기 대여'로 처리.
즉, 30일 이상과 30일 미만으로 나누는 구조
하지만 문제를 풀 때 간과한 사실이 있다.
빌린 당일에 반납하면 그 대여기간은 며칠일까?
빌린 당일에 반납한 경우, 대여 기간은 1일로 간주하는 것이 일반적이다.
보통 대여 서비스에서는 "대여 시작일과 반납일이 동일"해도, 대여 기간을 최소 1일로 계산한다.
DATEDIFF(END_DATE, START_DATE) 함수는 END_DATE와 START_DATE의 일 단위 차이를 계산하는 함수인데 예를 들어서 DATEDIFF('2022-09-01', '2022-09-01')의 결과는 0이다. 하지만 실제 대여 기간으로는 "빌린 날을 포함"해 최소 1일로 간주해야 한다. 일단 빌리고 당일 반납했다고 하더라도 대여 기간은 1일이기 때문이다.
한 마디로 대여 시작일과 대여 종료일 둘다 대여기간에 포함된다.
따라서 DATEDIFF 함수쓰고 + 1 해줘야 한다.
그래서 DATEDIFF < 29일 때를 '단기 대여'로 간주하고
29 미만를 단기 대여로 처리하고, 29 이상(ELSE 구문)을 장기 대여로 간주하도록 조건을 수정했다.
📌 최적 코드
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(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE DATE_FORMAT(START_DATE, '%Y%m') = '202209' ORDER BY HISTORY_ID DESC;
IF문으로 3항 연산자처럼 쓸 수 있구나...
IF(condition, value_if_true, value_if_false)
IF(DATEDIFF(END_DATE, START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
'코딩테스트 > SQL테스트' 카테고리의 다른 글
[프로그래머스] (MySQL) 중성화 여부 파악하기 문제풀이 (14) | 2025.01.18 |
---|---|
[프로그래머스] (MySQL) 이름에 el이 들어가는 동물 찾기 문제풀이 (8) | 2025.01.16 |
[프로그래머스] (MySQL) 조건에 부합하는 중고거래 상태 조회하기 (4) | 2025.01.14 |
[프로그래머스] (MySQL) 자동차 평균 대여 기간 구하기 문제 풀이 (10) | 2025.01.14 |
[프로그래머스] (MySQL) 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 문제풀이 (64) | 2024.11.25 |