Study/SQL

[프로그래머스 SQL] 자동차 대여 기록에서 장기/단기 대여 구분하기

delay100 2024. 1. 11. 11:34
728x90
반응형
SMALL

코딩테스트 연습 > String, Date > 자동차 대여 기록에서 장기/단기 대여 구분하기

난이도: Lv.1

언어: MySQL

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

실패

SELECT 
    a.HISTORY_ID
    , a.CAR_ID
    , DATE_FORMAT(a.START_DATE, '%Y-%m-%d') AS START_DATE
    , DATE_FORMAT(a.END_DATE, '%Y-%m-%d') AS END_DATE
    , IF(DATEDIFF(a.END_DATE, a.START_DATE) >= 30, '장기대여', '단기대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE 1=1
AND DATE_FORMAT(a.START_DATE, '%Y-%m') LIKE '2022-09'
# AND a.START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC

실패이유

1. 날짜는 현재 하루를 포함해야함

1월 30일에서 1월 1일을 빼면 29일이 나옴(산수에서 30-29)

즉, 단순히 END_DATE - START_DATE를 하면 빌린 날(1일)을 포함하지 않음

2. 띄어쓰기에 주의해야함

문제에 '장기 대여', '단기 대여'로 나와있으나, '장기대여', '단기대여'로 작성하여 계속 실패를 만났음.

성공

SELECT 
    a.HISTORY_ID
    , a.CAR_ID
    , DATE_FORMAT(a.START_DATE, '%Y-%m-%d') AS START_DATE
    , DATE_FORMAT(a.END_DATE, '%Y-%m-%d') AS END_DATE
    , IF(DATEDIFF(a.END_DATE, a.START_DATE) >= 29, '장기 대여', '단기 대여') AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY a
WHERE 1=1
AND DATE_FORMAT(a.START_DATE, '%Y-%m') = '2022-09'
# AND a.START_DATE LIKE '2022-09-%'
ORDER BY HISTORY_ID DESC

DATE_FORMAT이 아닌, 주석으로 처리한 LIKE절로 처리해도 잘 됩니다.

그러나 날짜계산이기에 더 구체적인 DATE_FORMAT 함수를 이용하였습니다.

*참고 chatGPT

없습니다.

 


코드에 질문이 있으시면 댓글을 달아주세요. 최대한 빠른 시일 내에 답변해드리겠습니다. 

봐주셔서 감사합니다.

728x90
반응형
LIST