25.5.11TIL

황효정·2025년 5월 11일

데이터 분석

목록 보기
59/88

오늘의 sql문제

#정답쿼리
SELECT history_id, car_id, 
 date_format(start_date, '%Y-%m-%d') start_date,
 date_format(end_date, '%Y-%m-%d') 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 like '2022-09%'
order by history_id desc

이 문제의 블로커는 세가지였다.
🧱첫번째: 문제를 잘 읽자‼️ 나는 처음에는 '장기대여', '단기대여'라고 작성했었다. 근데 문제에 보면 '장기 대여', '단기 대여' 라고 쓰라고 명시되어 있다. 띄어쓰기가 키포인트였다.

🧱두번째: 처음에는 날짜 차이를 그냥 -(빼기)로 계산했다. 근데 좀 계산이 잘못되는것 같아서 찾아보니 mysql에서는 날짜사이에 -이게 성립이 안된다고 한다,,? 다른 sql서버들 중에서는 사용가능한 것이 있긴 하다. mysql에서는 날짜 차이는 datediff함수를 사용한다.
datediff(끝나는 날짜, 시작 날짜): 끝나는날짜-시작날짜. (끝나는 날짜를 앞으로 위치시키는 이유는, 날짜는 뒤로 갈수록 커지기 때문이다.)

🧱세번째: 진짜 얘는 도저히 모르겠어서 정답지를 보았는데, 문제에서 30일 이상이라고 했으니까 >=30을 작성했는데, 알고보니 당일에 빌린것도 1일로 친다고 한다. 그래서 이게 도대체 왜..???? 싶어서 여기저기 알아보았는데 렌트카는 당일에 빌린것을 0일로 치는것이 아니라 1일로 친다고 한다. 근데 보니까 나같은 사람들이 되게 많았다. 다들 그 일수때문에 정답이 틀려서 도대체 왜 틀렸냐고 질문을 올린사람들이 많았다.

# 지피티가 수정해준 쿼리:
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) + 1 >= 30 THEN '장기 대여' 
    ELSE '단기 대여' 
  END AS rent_type
FROM car_rental_company_rental_history
WHERE start_date LIKE '2022-09%'
ORDER BY history_id DESC;

그래서 현실기반,,을 생각해보아야 한다는 것. 이 키포인트인것 같다.

datediff(end_date, start_date) >= 29 #이렇게 써도 되고
DATEDIFF(end_date, start_date) + 1 >= 30 #이렇게 써도 됨.

이거 솔직히 잘 이해가 안되는데 다시 내 언어로 정리를 해보자면,, 대여일이 1일차인지 어떻게 알 수 있을까,, 음,, 문제를 다시보면 "대여기간이 30일 이상이면 장기 대여, 그렇지 않으면 단기 대여"로 표시하라고 한다.

여기에 힌트가 숨어있는 것 같다.-> 대여기간 30일을 셀 때 어떻게 세는지 생각을 해보자. 만약 2022년 9월 1일에 빌렸는데, 2022년 9월 2일에 반납을 했다고 치자. 그러면 빌린 일수는 어떻게 될까?
1일을 빌린것이 아니라 2일을 빌린것으로 계산해야 된다. 왜냐하면 9월1일이 빌린 하루, 9월 2일에도 여전히 빌렸기 때문에 1+1을 해서 총 2일을 빌린 셈이다.

이것을 토대로 생각을 해본다면 9월 1일에 빌려서 9월 1일에 반납했을 경우: 1일을 빌린것으로 된다. 하루 빌렸다는 소리. 그래서 실제로 datediff함수를 써서 대여종료일-대여시작일을 했을 때는 숫자 0이 나오지만 실제 빌린일수는 1일이 된다.

그래서 대여기간 30일이라는 것은: datediff함수에서 +1을 더해줘야 한다는 말이다. => datediff(end_date, start_date)+1 >=30
그리고 이것은 datediff함수의 값이 29인 것을 의미하기도 한다.
=> datediff(end_date, start_date) >= 29

profile
청지기

0개의 댓글