강의로 돌아가기
신창호

이거 버그인건가요?? (약간 바꿔서 문제는 풀었답니다.)

MySQL 으로 풀었는데, 풀다보니 분명 맞는거 같지만 계속 오답이라 하여 글을 남겨봅니다.

일단 왜 오답이 나오는지 계속 찾다보니, CAR_ID가 1인경우 DATEDIFF(END_DATE +1 , START_DATE) 만 빈값이 나오더라고요.
DATEDIFF함수를 사용해서, END_DATA에 1을 날짜 평균값 계산하기 전에 1을 더해줘서 했는데 왜그러는 걸까요? (다른 것들은 다 정상으로 잘 나와서 더 의문..)

SELECT CAR_ID ,
DATEDIFF(END_DATE  , START_DATE) AS one, DATEDIFF(END_DATE +1 , START_DATE) AS two
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY;

의 경우

CAR_ID one two
중간 생략 --
2 30 31
2 93 94
1 30
작성중인 코드―solution.sql
1
2
3
4
5
6
7
8
9
10
11
-- 평균 대여기간이 7일 이상
-- 자동차 ID, 평균대여기간(소수점 두번째 자리 반올림) 리스트 출력 
-- 1순위 평균대여기간 내림차순, 2순위 자동차 ID 내림차순 
-- 반올림(평균())
SELECT CAR_ID , ROUND(AVG(DATEDIFF(END_DATE , START_DATE)+ 1),1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID 
HAVING AVERAGE_DURATION >=7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC

# SELECT * FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
1 개의 답변
Jaron

SELECT END_DATE, END_DATE +1 를 실행 해 보면 두 경우의 데이터 형식이 다르게 출력되는 것을 확인할 수 있습니다. 이때 2022년 11월 30일의 경우 1을 더했을 때 12월 1일이 아닌 11월 31일이라는 존재하지 않는 날짜 데이터로 바뀌게 됩니다. 날짜를 계산할 때는 단순 덧셈/뺄셈이 아닌 DATE_ADD를 이용해 연산해야합니다. 작동 안되던 코드는 아래와 같이 수정하면 정상적으로 결과가 나오는 것을 확인할 수 있습니다.

SELECT CAR_ID ,
DATEDIFF(END_DATE , START_DATE) AS one, DATEDIFF(DATE_ADD(END_DATE, INTERVAL 1 DAY), START_DATE) AS two
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

  • 신창호

    아하! 제 역량 부족이였군요! 친절히 알려주셔서 감사합니다 ㅎㅎ

    신창호―2024.01.10 17:37
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.