[SQL] 자동차 평균 대여 기간 구하기 문제 문의 후기

신창호·2024년 1월 10일
0

SQL

목록 보기
2/3
post-thumbnail

📌 이상한 점 발견

문제를 풀다가, 분명 이상없이 푼것 같은데 계속 오답이라고 하여, 직접 값을 하나하나 출력해보다가 이해가 가질않는 점을 발견하게되어 문의가 시작되었습니다.
(물론이때까지만 해도 문의 넣어 볼 생각안함.)

문제 요약

  • 일단 이 문제에 버그가 있다는 것을 알기 위해선 먼저 문제의 요구사항과 간략하게 풀이방법을 이해하고 있어야하는데
  • 평균 대여시간을 구해야되기 때문에, 날짜의 값을 빼야되는 경우가 생긴다.
  • 위 과정을 하기위해 DATEDIFF() 함수를 사용했고, 사용기간이기 때문에 처음날짜와 끝날짜의 차이에 +1을 해야되는 상황이였다.
  • 하지만, 여기서 문제가 발생했다.

문의내용 설명

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_IDonetwo
중간생략--
23031
29394
130



📌 문의 넣기

  • 위 질문하기를 작성하다보니, 더욱더 이상함을 느끼고 직접 문의하여 의문점을 해결하고 싶었다.

✉️ 답변

  • 문의하고 다음날 바로 답변이 왔다! 내용은 아래와 같다.

  • 먼저 날짜형식의 데이터를 숫자로 바꾸면 %y%m%d(연월일) 그대로 들어간다.

    • ex) '1991-01-12' -> 19910112 , '2023-12-31' -> 20231231
  • 그렇기에 날짜 20231130 -> 23년 11월 30일은 가능하지만, 20231131 -> 11월 31일은 안되는 것

  • 숫자 1만 더하게된다면, 12월 1일이 아닌 11월 31일로 연산이 되기때문에, 존재하지 않는 날짜데이터는 에러가 나는 것이다.

    실습환경에서 테스트 해보기

  • 실습 테스트 링크 : w3schools

    • MySQL환경

  • 기존 데이터가 8월 30일로 +2를 하게될 경우 8월 32일로 없는 날짜가 된다.
    • 그렇기에 BirthDate+2 의 값은 19630832
    • Date_add(BirthDate interval 2 day)의 값은 19630901

이로써, 날짜 함수를 꼭 써줘야 에러가 나올 경우의 수가 훨씬 적어진다는 것을 알게되었다.
또, 모르는게 있으면 이렇게 물어보니 금방 해결되고, 배울수있다는 점도 느꼈고,
반대로, 나도 누군가 물어본다면, 원리까지 알고 있어 답변할 수 있어야겠다는 생각이 들었다.

DATE_ADD

  • 이 함수도 잠깐 짚고가자면, MySQL에서는 날짜와 시간에 대한 연산을 수행하는 함수이다.
  • 그래서 사용법은
DATE_ADD(date, INTERVAL value unit)
  • date : 첫번째 인자는 계산될 날짜 또는 시간 값
  • INTERVAL : 두번째 인자의 1번째 뒤에 value와 unit을 하나로 묶어주는 역할
  • value : 두번째 인자의 2번째 date 추가할 값, (음수면 빼주게 된다.)
  • unit : 두번째 인자의 3번째 unit값은 value에 대한 단위(DAY, MONTH, HOUR등)
    • 두번째 인자 사이에 꼭 띄어쓰기가 있어야 된다.
profile
한단계씩 올라가는 개발자

0개의 댓글